代码之家  ›  专栏  ›  技术社区  ›  Lucy82

Oracle-选择案例中的动态SQL

  •  0
  • Lucy82  · 技术社区  · 6 年前

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

    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本身工作得很好,我只是在编写一个动态SQL时遇到了一些问题,该SQL将表名与它连接起来。感谢您的帮助!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Littlefoot    6 年前

    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;