我正在编写一个函数,用于将表名作为参数来检查表是否为空。这是我的代码:
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连接在一起时遇到问题。任何帮助表示赞赏!
答案 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;