PL / SQL ORA-00905: отсутствует ключевое слово для заданного значения - PullRequest
0 голосов
/ 18 мая 2018

Я искал эту ошибку, но так как она очень расплывчатая, я не смог найти что-то похожее, чтобы понять, в чем проблема.Этот код фактически предназначен для приложения Oracle Apex.На самом деле у меня есть переменные связывания вместо чисел 1 и 84 (которые я подтверждаю, это правильные значения в моих таблицах), но все равно получаю ту же ошибку.

После объявления переменных он выбирает строку, которая будет именемстолбец в другой таблице и поместите его в V_COLUMN.

Затем я динамически создаю запрос, чтобы получить значение этого столбца и помещаю его в V_VALUE, и, наконец, я возвращаю значение (которое затем отображается в текстовом поле формы),К сожалению, он возвращает ORA 00905.

Когда я пытался запускать команды sql отдельно, используя известные значения, он запускается.Поэтому я думаю, что где-то в динамическом sql должна быть какая-то проблема синтаксиса.Спасибо за любую помощь.

DECLARE
    V_COLUMN VARCHAR2(50) := 'UNKNOWN';
    V_VALUE VARCHAR2(50) := 0;
    V_SQL VARCHAR2(500);
BEGIN
    SELECT SUB_CAT_ABBREV INTO V_COLUMN FROM SUB_CATEGORY WHERE SUB_CATEGORY_ID = 1;
    V_SQL := 'SELECT ' || V_COLUMN || ' INTO V_VALUE FROM PLANNED_EFFORTS WHERE PLAN_ID = 84';
    EXECUTE IMMEDIATE V_SQL;
    RETURN V_VALUE;   
EXCEPTION
  WHEN no_data_found THEN
    RETURN 'No Data Found Error'; 
  WHEN too_many_rows then
    RETURN 'Too many rows';
  WHEN OTHERS THEN
    RETURN 'Other Error';
END;

1 Ответ

0 голосов
/ 18 мая 2018

Просто избавьтесь от предложения INTO из своего динамического оператора SQL:

V_SQL := 'SELECT ' || V_COLUMN || ' FROM PLANNED_EFFORTS WHERE PLAN_ID = 84';
EXECUTE IMMEDIATE V_SQL
INTO V_VALUE 

Более того, если вы ожидаете более одного значения, вы можете использовать BULK COLLECT INTO и возвращать значения в некоторый тип коллекции:

 V_SQL := 'SELECT ' || V_COLUMN || ' FROM PLANNED_EFFORTS WHERE PLAN_ID = 84;
    EXECUTE IMMEDIATE V_SQL
    BULK COLLECT INTO V_VALUES

, где V_VALUES может быть объявлено как:

TYPE TABLE_OF_VARCHAR2 IS TABLE OF VARCHAR2(50);
V_VALUES TABLE_OF_VARCHAR2;

и доступно в цикле следующим образом:

for i in V_VALUES.FIRST .. V_VALUES.LAST LOOP
  -- V_VALUES(i)
END LOOP;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...