在 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 子句中的 (+) 运算符的目的是啥?

在“where”子句中使用“in”运算符更新行

在 where 子句中使用多个条件时出现关系运算符错误

如何在带有 select 语句的 where 子句中使用比较运算符?

如果需要运算符的 where 子句中的条件

5.WHERE 子句