在 Oracle 中执行动态 Sql 查询

smi*_*ilu 3 sql oracle plsql stored-procedures

我有一个SELECT查询,其中我将有一个动态WHERE条件。问题是当我尝试将WHERE条件PARAMETER与 SQL 查询连接起来时,它不允许我保存PROCEDURE.

例如:

CREATE PROCEDURE usp_MySearchQuery
(
  QTYPE IN INT,
  OUT_CUR OUT SYS_REFCURSOR
)
IS
DYN_QUERY VARCHAR2;
BEGIN
    IF QTYPE=1 THEN
       DYN_QUERY :=' BETWEEN 1 AND 2';
    ELSE
       DYN_QUERY :='=10';    
    END IF;

    OPEN OUT_CUR FOR
         SELECT * FROM MYTABLE WHERE TYPE=QTYPE AND ID || DYN_QUERY;
END;
Run Code Online (Sandbox Code Playgroud)

这就是我的程序的样子。我试过了,EXECUTE IMMEDIETE但在它的文档中,它写成它不适用于多行查询。

MSSQL我们有EXEC(不确定)可以execute将文本发送到命令的命令。以同样的方式,我们是否有任何可以运行动态查询的命令Oracle


UPDATE: Answer
Run Code Online (Sandbox Code Playgroud)

我是这样试的。

  OPEN OUT_CUR FOR
        ' SELECT * FROM MYTABLE WHERE TYPE=:QTYPE AND ID ' || DYN_QUERY
          USING QTYPE;
Run Code Online (Sandbox Code Playgroud)

它起作用了

Mah*_*kar 5

动态字符串必须是“单引号”括起来

OPEN OUT_CUR FOR
     'SELECT * FROM MYTABLE WHERE ID '|| DYN_QUERY;
Run Code Online (Sandbox Code Playgroud)

EXECUTE IMMEDIATE允许多行结果,如果您使用BULK COLLECT

示例:

DECLARE
  TYPE myarray IS TABLE OF VARCHAR2(100);
  v_array myarray;
BEGIN
  EXECUTE IMMEDIATE 'select ''x'' from dual union all select ''y'' from dual'
    BULK COLLECT INTO v_array;

  --Or you could use the alternative quoting mechanism to avoid doubling quotation marks.
  --EXECUTE IMMEDIATE q'[select 'x' from dual union all select 'y' from dual]'
  --  BULK COLLECT INTO v_array;

  FOR i IN 1..v_array.count
  LOOP
    DBMS_OUTPUT.PUT_LINE(v_array(i));
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

EXECUTE IMMEDIATE使用绑定变量

String := 'SELECT * FROM EMP WHERE name = :name AND age = :age AND :name <> ''Mahesh''';

EXECUTE IMMEDIATE String USING 'Mahi',21,'Mahi';
<OR>
EXECUTE IMMEDIATE String USING proc_variable1,proc_variable2,proc_variable1;
Run Code Online (Sandbox Code Playgroud)