动态 Select 查询

Dynamic Select Query

我想运行在oracle中动态SELECTsql。

在Sql服务器中很简单

  declare @a int,@b int,@c int;

   set @a=1;
   set @b=2;
   set @c=3;

   drop table empl
   create table empl (id int,name nvarchar(100))
   insert into empl values (1,'name1'),(2,'name2'),(3,'name3'),(4,'name4'),(5,'name4')

  select * from empl
  where id=@a or id= @b or id=@c

结果:

1   name1
2   name2
3   name3

但是当我尝试在 oracle 中使用 EXECUTE IMMEDIATE 执行此操作时,我遇到的问题是它不支持没有 into 的 select 语句。

如何在 Oracle 中实现这条语句?

在您使用 SQL 服务器语法的示例中,您所做的只是 投影 三个值,102030。我在那里没有看到任何 dynamic

SQL> SELECT 10 a, 20 b, 30 c FROM dual;

         A          B          C
---------- ---------- ----------
        10         20         30

PL/SQL中,你只需要声明变量赋值.

SQL> set serveroutput on
SQL> DECLARE
  2    a     NUMBER;
  3    b     NUMBER;
  4    c     NUMBER;
  5    var_a NUMBER;
  6    var_b NUMBER;
  7    var_c NUMBER;
  8  BEGIN
  9    a :=10;
 10    b := 20;
 11    c := 30;
 12    SELECT A,b,c INTO var_a, var_b, var_c FROM DUAL;
 13    DBMS_OUTPUT.PUT_LINE('Values are '||var_a||' '||var_b||' '||var_c);
 14  END;
 15  /
Values are 10 20 30

PL/SQL procedure successfully completed.

UPDATE 根据 OP 的更新问题:

您不需要显式游标,只需使用循环游标

例如,在 SCOTT 架构中使用标准 EMP table:

SQL> set serveroutput on
SQL> DECLARE
  2    a     NUMBER;
  3    b     NUMBER;
  4    c     NUMBER;
  5  BEGIN
  6    a := 10;
  7    b := 20;
  8    c := 30;
  9    FOR i IN (SELECT empno FROM emp WHERE deptno IN (a, b, c))
 10    LOOP
 11    DBMS_OUTPUT.PUT_LINE('Employee number is '||i.empno);
 12    END LOOP;
 13  END;
 14  /
Employee number is 7369
Employee number is 7499
Employee number is 7521
Employee number is 7566
Employee number is 7654
Employee number is 7698
Employee number is 7782
Employee number is 7788
Employee number is 7839
Employee number is 7844
Employee number is 7876
Employee number is 7900
Employee number is 7902
Employee number is 7934

PL/SQL procedure successfully completed.