在 where 子句中替换动态运算符而不是手动运算符
Posted
技术标签:
【中文标题】在 where 子句中替换动态运算符而不是手动运算符【英文标题】:Substitute dynamic operators in where clause instead of manual operators 【发布时间】:2015-11-21 06:08:17 【问题描述】:Oracle sql developer,用 where 子句中的动态运算符代替手动运算符
我正在编写带有一组运算符的 ARGUMENT 程序。
我只想在 where 子句中替换那个动态运算符。请指导我如何实现这一目标。
Select * from table where field (ARGUMENT) 100.
注意:在上面的查询中,ARGUMENT 有'+,<,>,<=,>='
。
【问题讨论】:
简单的答案是使用Dynamic Query
我试过但不能。你能发布样本吗?
oracle语法不是特别好,看这里dba.stackexchange.com/questions/667/…
你不能在 SQL 中这样做,你需要(ab)在 PL/SQL 中使用 EXECUTE IMMEDIATE。
请将示例查询发布为答案@lalith kumar。谢谢...
【参考方案1】:
在纯 SQL 中不能有动态运算符,它必须是静态的。您需要(ab)在 PL/SQL 中使用 EXECUTE IMMEDIATE 来执行 动态 SQL。
例如,在 SCOTT 模式中使用标准 EMP 表:
SQL> set serveroutput on
SQL> declare
2 v_empno NUMBER;
3 v_operator VARCHAR2(2);
4 v_dyn_sql VARCHAR2(200);
5 BEGIN
6 v_operator := '=';
7 v_dyn_sql := 'SELECT empno FROM emp WHERE ename '||v_operator||' ''SCOTT''';
8 EXECUTE IMMEDIATE v_dyn_sql INTO v_empno;
9 DBMS_OUTPUT.PUT_LINE('employee number is '||V_EMPNO);
10 END;
11 /
employee number is 7788
PL/SQL procedure successfully completed.
或者,在 SQL*Plus 中使用 绑定变量:
SQL> variable v_operator varchar2(2);
SQL> exec :v_operator := '=';
PL/SQL procedure successfully completed.
SQL> print v_operator;
V_OPERATOR
----------------------
=
SQL> set serveroutput on
SQL> declare
2 v_empno NUMBER;
3 v_dyn_sql VARCHAR2(200);
4 v_operator VARCHAR2(2);
5 BEGIN
6 v_operator := '=';
7 v_dyn_sql := 'SELECT empno FROM emp WHERE ename '||:v_operator||' ''SCOTT''';
8 EXECUTE IMMEDIATE v_dyn_sql INTO v_empno;
9 DBMS_OUTPUT.PUT_LINE('employee number is '||V_EMPNO);
10 END;
11 /
employee number is 7788
PL/SQL procedure successfully completed.
【讨论】:
@Jambu 请将其标记为已回答,对其他人有帮助!请参阅Stack Overflow tour 以了解该网站的运作方式。 只需选择此答案左侧的勾号 正确使用绑定变量是v_dyn_sql := 'SELECT empno FROM emp WHERE ename '||v_operator||' :p1'; EXECUTE IMMEDIATE v_dyn_sql USING 'SCOTT' INTO v_empno;
为什么将动态 SQL 视为“滥用”?
@WernfriedDomscheit 这不是 OP 想要的,他希望操作员是动态的。而且没有人担心sql注入知道操作符,而是知道值。而且,是的,这是对动态 sql 的滥用,因为这不是 PL/SQL 中支持动态 sql 的目的。以上是关于在 where 子句中替换动态运算符而不是手动运算符的主要内容,如果未能解决你的问题,请参考以下文章
在 Oracle SQL 中,除了外连接之外,where 子句中的 (+) 运算符的目的是啥?