Oracle - динамический SQL в случае выбора - PullRequest
0 голосов
/ 16 ноября 2018

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

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

1 Ответ

0 голосов
/ 16 ноября 2018

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...