Ошибка 00904 Неверный идентификатор из предложения WHERE в PL SQL Выберите оператор Oracle - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь создать оператор SELECT и выполнить его, но у меня продолжает появляться эта ошибка. Мое утверждение выглядит примерно так:

DECLARE
   SOMESTRING varchar2(20);
BEGIN
   SOMESTRING := 'Test_Col';
   EXECUTE IMMEDIATE 'SELECT * FROM TBL_TEST WHERE column = ' || SOMESTRING;

Я получаю «00904. 00000 -«% s: неверный идентификатор ». Я знаю, что это должно быть синтаксической ошибкой, но я не уверен, что должно быть записано как Я новичок в PL / SQL.

РЕДАКТИРОВАТЬ:

Я пробовал это:

EXECUTE IMMEDIATE 'SELECT col FROM TBL_TEST WHERE aColumn = '''Literal_String''' into TEST_VALUE;

Он выводит значение правильно, но когда я делаю:

EXECUTE IMMEDIATE 'SELECT col FROM TBL_TEST WHERE aColumn = :SOMESTRING' INTO TEST_VALUE USING SOMESTRING;

Нет данных. Да, я объявил все необходимые переменные.

РЕДАКТИРОВАТЬ 2:

В своем приложении я назначил SOMESTRING для:

SOMESTRING := CONCAT('A', SUBSTR(a_table_name, 2));

В этом случае, как сделать тройную кавычку в этом случае? Потому что она просто станет литеральной строкой.

1 Ответ

1 голос
/ 22 января 2020

используйте это:

DECLARE
   SOMESTRING varchar2(20);
BEGIN
   SOMESTRING := 'Test_Col';
   EXECUTE IMMEDIATE 'SELECT col1 FROM TBL_TEST WHERE column = :SOMESTRING' using SOMESTRING;
END;

Редактировать:

DECLARE
   SOMESTRING varchar2(20);
   abv   varchar2(20); -- Variable to hold your result
BEGIN
   SOMESTRING := 'Test_Col';
   EXECUTE IMMEDIATE q'[SELECT 'A' FROM DUAL WHERE 'Test_Col' = :SOMESTRING]' into abv using SOMESTRING ;

   dbms_output.put_line(abv); -- Print your result.
END;

Объяснение:

Блок ниже показывает, какие значения вы пытаетесь передать. Если вы видите первое утверждение, вы увидите, что вы передаете строковый литерал с ', но во втором выражении, когда вы передаете его как bind varaible, вы передаете его без '. Следовательно, вы не получаете данных.

declare
  v   varchar2(1000);
  SOMESTRING varchar2(20);
begin 

v:= 'SELECT col FROM TBL_TEST WHERE aColumn = ''literal_string''';
dbms_output.put_line (v);

SOMESTRING := 'Test_Col';
dbms_output.put_line (SOMESTRING);
v:='SELECT col FROM TBL_TEST WHERE aColumn = :SOMESTRING';
dbms_output.put_line (v);

end;

Выход:

SELECT col FROM TBL_TEST WHERE aColumn = 'literal_string'
SELECT col FROM TBL_TEST WHERE aColumn = :SOMESTRING

SELECT col FROM TBL_TEST WHERE aColumn = 'literal_string'
Test_Col
SELECT col FROM TBL_TEST WHERE aColumn = :SOMESTRING

Способ устранения:

while assiging `SOMESTRING` do it as :

SOMESTRING := '''Test_Col''';
...