Oracle-选择情况下的动态SQL

时间:2018-11-16 05:36:30

标签: sql oracle plsql oracle11g

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

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来将表名与It连接在一起时遇到问题。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

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;