【问题标题】:Oracle - dynamic SQL in Select caseOracle - Select case 中的动态 SQL
【发布时间】:2018-11-16 05:36:29
【问题描述】:

我正在编写一个函数来检查表是否为空,并将表名作为参数传递。这是我的代码:

CREATE OR REPLACE FUNCTION EMPTY_TABLE (table_name IN VARCHAR2) 
RETURN NUMBER 
IS

Is_empty NUMBER;
v_SQL VARCHAR(1000);
BEGIN

 v_SQL:= 'SELECT CASE 
           WHEN EXISTS(SELECT 1 FROM ' || table_name || ') 
           THEN  1
           ELSE 0
         END INTO Is_empty
  FROM DUAL';

 execute immediate v_SQL;

RETURN Is_empty;

END EMPTY_TABLE;
/

这段代码编译没有错误,但是当我执行它时,我得到错误:ORA-00905:缺少关键字。 Select Itself 工作正常,我只是遇到了如何编写将表名与它连接起来的动态 SQL 的问题。任何帮助表示赞赏!

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    INTO 放错地方了;应该是EXECUTE IMMEDIATE的一部分:

    SQL> CREATE OR REPLACE FUNCTION EMPTY_TABLE (table_name IN VARCHAR2)
      2     RETURN NUMBER
      3  IS
      4     Is_empty   NUMBER;
      5     v_SQL      VARCHAR (1000);
      6  BEGIN
      7     v_SQL :=
      8           'SELECT CASE
      9             WHEN EXISTS(SELECT 1 FROM '
     10        || table_name
     11        || ')
     12             THEN  1
     13             ELSE 0
     14           END                               --> not here ...
     15    FROM DUAL';
     16
     17     EXECUTE IMMEDIATE v_SQL INTO Is_empty;  --> ... but here
     18
     19     RETURN Is_empty;
     20  END EMPTY_TABLE;
     21  /
    
    Function created.
    
    SQL> SELECT empty_table ('dept') FROM DUAL;
    
    EMPTY_TABLE('DEPT')
    -------------------
                      1
    
    SQL> SELECT empty_table ('dept') FROM DUAL;
    

    【讨论】:

    • 感谢您的回答。我是如此接近但仍然很远:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2013-06-06
    • 2015-02-27
    • 2012-05-10
    • 2021-11-26
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多