Oracle - динамический SQL в случае выбора

95
9

Я пишу функцию для проверки, если таблица пуста или нет, с передачей имени таблицы в качестве параметра. Вот мой код:

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, который бы объединял с ним имя таблицы. Любая помощь приветствуется!

спросил(а) 2018-11-16T08:36:00+03:00 1 год, 8 месяцев назад
1
Решение
69

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;

ответил(а) 2018-11-16T09:13:00+03:00 1 год, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема