java中sql语句为啥不能出现 * ?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中sql语句为啥不能出现 * ?相关的知识,希望对你有一定的参考价值。
数据库语句中,不要用 * 来代替也不能出现用变量拼写的语句欠规范代码示例:
//一个sql查询语句
String sql = "select * from student where id ="+ user.getId();
规范代码示例:
String sql = "select id,name,sex,age from student where id =?";
解析:1.用属性名而不用*让语句看起来更加清析易懂。
2.在增加或删除属性的时候出错的机率更少,也容易找出问题来。
3.一般情况不要去拼凑sql语句,应当用占位符,预处理来发送sql语句;追问
* 查询整张表的时候,不是更清晰更加容易看懂吗?
追答在查询整张表的时用*,虽然简单易懂,可是别人知道你查了什么呢?别人要看是你查了什么,你这张表里面有那些东西。还有当数据库里面有字段为空的时候,很容易报错。如果查询用的是属性名,当出错的时候,更容易找到。
参考技术A 用*的效率比较低。这样写数据库首先需要解析该表中有哪些字段,然后再查询,所以效率低。 参考技术B *是通配符. 当然不能出现.
不过可以用select * form table 代表查所有.. 参考技术C 谁说不能用*
我一直这样写String sql=“ select * from tableName ”; 参考技术D 可以用*,但是不推荐
为啥我不能在立即执行语句中使用绑定变量?
【中文标题】为啥我不能在立即执行语句中使用绑定变量?【英文标题】:Why I can't use a bind variable in an execute immediate statement?为什么我不能在立即执行语句中使用绑定变量? 【发布时间】:2011-08-02 05:23:16 【问题描述】:当我为execute immediate
构建动态 SQL 语句时,我想使用绑定变量而不是字符串连接。
在下面的示例中,我可以为a
、b
和ret
使用绑定变量,但是当我尝试为f
绑定时,我得到一个ORA-06502: PL/SQL: numeric or value error: character to number conversion error
。为什么以及如何绑定f
?
我使用的是 11.2.0.1.0。
create or replace function so4fun (
a in number,
b in number,
f in varchar2
) return number as
decl constant varchar2(32767) :=
'declare a constant number := :a; b constant number := :b;';
stmt varchar2(32676);
ret number;
begin
/* This one works: */
stmt := decl || ' begin :result := ' || f || '; end;';
execute immediate stmt using in a, in b, out ret;
/* But why this one doesn't ?
stmt := decl || ' begin :result := :f; end;';
execute immediate stmt using in a, in b, out ret, in f;
This doesn't work either:
stmt := decl || ' tmp number; begin tmp := :f; :result := tmp; end;';
execute immediate stmt using in a, in b, in f, out ret;
Both are giving me ORA-06502: PL/SQL: numeric or value error: character to
number conversion error */
return ret;
end;
/
show errors
/* expected result when a = 1, b = 2 is 1.5 */
select so4fun(1, 2, '(a + b) / b') from dual;
drop function so4fun;
【问题讨论】:
我选择了 Codo 的答案,因为我看到他的答案更全面、更紧凑。但是,我也发现 Ray Toal 的回答很有用,我也可以从他的回答中得出我的问题的答案。希望大家多多点赞! 【参考方案1】:绑定变量用于绑定变量,而不是用于绑定代码片段。这个想法是,Oracle 可以编译和缓存一个查询或代码块,并使用不同的参数多次执行它。
但是,您尝试使用参数绑定来替换计算公式。它会阻止编译和缓存代码块,因此不受支持。
此外,它不能用当前的语法来表达。如果 Oracle 看到tmp := :f
,它认为您只是想将参数f
分配给变量tmp
。它不需要评估函数。
只需使用可行的解决方案即可。毕竟它有效。
【讨论】:
【参考方案2】:发生错误是因为您将f
声明为varchar2
,但您在注释掉的部分中写了以下内容:
tmp number; begin tmp := :f ...
您尝试将“字符”值分配给需要数字的变量。您还尝试将 f
分配给再次需要数字的函数结果。
||
可以正常工作,因为这是字符串连接。
您需要以某种方式将您的 varchar2 转换为数字 (TO_NUMBER(f)
),或者编写您的 proc 以接受参数 f
作为数字而不是 varchar2。
【讨论】:
所以 Oracle 帮了我一个忙,它会检查绑定变量是否是正确的类型?对于f
,我的意图是生成一个类似begin :result := (a + b) / b; end;
的语句,但它失败了,因为:result
绑定到一个数字,而(a + b) / b
在绑定发生时是一个varchar2?
哦,您希望 f
成为 varchar2 "(a + b) / b"
吗?也就是说,f
是您要评估的字符串的文本?在这种情况下,绑定是不合适的,您应该使用字符串连接。或者看看这里有没有帮助:asktom.oracle.com/pls/asktom/…以上是关于java中sql语句为啥不能出现 * ?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?
为啥我不能准备这个 sql 语句来设置 auto_increment?