简体   繁体   English

在Oracle中执行动态SQL查询

[英]Executing Dynamic Sql query in Oracle

I have a SELECT query in which i will have aa Dynamic WHERE condition. 我有一个SELECT查询,其中我将有一个动态WHERE条件。 The thing is when I try to concatenate the WHERE condition PARAMETER with the SQL Query its not allowing me to save the PROCEDURE . 问题是,当我尝试将WHERE条件PARAMETER与SQL查询连接在一起时,它不允许我保存PROCEDURE

eg: 例如:

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;

This is how my procedure looks like. 这是我的程序的样子。 I tried EXECUTE IMMEDIETE but in its documentation itself, its written it wont work for multiple row query. 我尝试了EXECUTE IMMEDIETE但是在它的文档本身中,它不能用于多行查询。

In MSSQL we have EXEC (not sure) command which can execute the text sent to the command. MSSQL我们具有EXEC (不确定)命令,该命令可以execute发送给该命令的文本。 In the same way do we have any commands which can run the dynamic query in Oracle 同样,我们是否具有可以在Oracle运行动态查询的任何命令


UPDATE: Answer

I tried like this. 我尝试过这样。

  OPEN OUT_CUR FOR
        ' SELECT * FROM MYTABLE WHERE TYPE=:QTYPE AND ID ' || DYN_QUERY
          USING QTYPE;

and it worked 而且有效

The Dynamic String has to be enclosed within 'Single Quotes' 动态字符串必须包含在“单引号”内

OPEN OUT_CUR FOR
     'SELECT * FROM MYTABLE WHERE ID '|| DYN_QUERY;

EXECUTE IMMEDIATE allows Multi row result, if you use BULK COLLECT 如果您使用BULK COLLECT ,则EXECUTE IMMEDIATE允许多行结果

Example: 例:

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;

EXECUTE IMMEDIATE using bind variables ; 使用绑定变量 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM