Одиночная кавычка в конце конца отсутствует в представлении создания в процедуре - PullRequest
0 голосов
/ 23 марта 2020

У меня есть хранимая процедура, где строковый параметр должен быть передан для создания представления, я сталкиваюсь с трудностью заключать строку в одинарные кавычки

 EXECUTE IMMEDIATE 
            'CREATE VIEW view_Exec_Data as
      Select * from Employees
            where exec_id='''' ||To_NChar(EID)||'''';  --EID is input parameter and value will be 9DE4D0106D1F390EE0

Вышеупомянутый запрос генерируется как

 EXECUTE IMMEDIATE 
            'CREATE VIEW view_Exec_Data as
      Select * from Employees
            where exec_id='9DE4D0106D1F390EE0; 

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

Спасибо Шива

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Нам не хватает информации; например, мне интересно, почему вы использовали TO_NCHAR ... вам действительно это нужно?

Вот пример, который предполагает, что таблица сотрудников выглядит следующим образом:

SQL> create table employees (exec_id varchar2(30), name varchar2(30));

Table created.

SQL> insert into employees values ('9DE4D0106D1F390EE0', 'Littlefoot');

1 row created.

SQL> select * From employees;

EXEC_ID                        NAME
------------------------------ ------------------------------
9DE4D0106D1F390EE0             Littlefoot

Процедура, которая создает представление. Я бы предложил НЕ сделать это. Вы действительно хотите иметь zillion просмотров, по одному на каждый EXEC_ID, который кто-то использует в качестве параметра? Какова цель сделать это? Почему бы вам просто

select * from employees where exec_id = :par_eid;

В любом случае, вот вам go: чтобы упростить такое количество одинарных кавычек, я использовал q-quoting mechanism.

SQL> create or replace procedure p_crv (par_eid in employees.exec_id%type)
  2  is
  3    l_str varchar2(200);
  4  begin
  5    l_str := q'[CREATE or replace VIEW view_Exec_Data as
  6                Select * from Employees
  7                where exec_id= to_nchar(']' || par_eid || q'[')]';
  8
  9    -- when using dynamic SQL, **ALWAYS** check whether command is properly written
 10    dbms_output.put_line(l_str);
 11
 12    -- if it looks OK, then execute it
 13    execute immediate l_str;
 14  end;
 15  /

Procedure created.

SQL> set serveroutput on
SQL> exec p_crv('9DE4D0106D1F390EE0');
CREATE or replace VIEW view_Exec_Data as
              Select * from Employees

where exec_id= to_nchar('9DE4D0106D1F390EE0')

PL/SQL procedure successfully completed.

SQL> select * From view_exec_data;

EXEC_ID                        NAME
------------------------------ ------------------------------
9DE4D0106D1F390EE0             Littlefoot

SQL>

Если вам не нужно to_nchar, это становится несколько проще:

SQL> create or replace procedure p_crv (par_eid in employees.exec_id%type)
  2  is
  3    l_str varchar2(200);
  4  begin
  5    l_str := q'[CREATE or replace VIEW view_Exec_Data as
  6                Select * from Employees
  7                where exec_id= ']' || par_eid || q'[']';
  8
  9    -- when using dynamic SQL, **ALWAYS** check whether command is properly written
 10    dbms_output.put_line(l_str);
 11
 12    -- if it looks OK, then execute it
 13    execute immediate l_str;
 14  end;
 15  /

Procedure created.

SQL> exec p_crv('9DE4D0106D1F390EE0');
CREATE or replace VIEW view_Exec_Data as
              Select * from Employees

where exec_id= '9DE4D0106D1F390EE0'

PL/SQL procedure successfully completed.

SQL> select * From view_exec_data;

EXEC_ID                        NAME
------------------------------ ------------------------------
9DE4D0106D1F390EE0             Littlefoot

SQL>
0 голосов
/ 23 марта 2020

Вы можете использовать:

EXECUTE IMMEDIATE 
            'CREATE VIEW view_Exec_Data as
      Select * from Employees
            where exec_id=To_NChar(''' || EID ||''')'; 
            --                     ^ 3 (')       ^ 3 + 1 (')

Обновление

Работа для меня. Смотрите это:

SQL> set serverout on
SQL> declare
  2  EID varchar2(100) := '9DE4D0106D1F390EE0';
  3  begin
  4  DBMS_OUTPUT.PUT_LINE('CREATE VIEW view_Exec_Data as
  5        Select * from Employees
  6              where exec_id=To_NChar(''' || EID ||''')');
  7  end;
  8  /
CREATE VIEW view_Exec_Data as
      Select * from Employees
            where
exec_id=To_NChar('9DE4D0106D1F390EE0')

PL/SQL procedure successfully completed.

SQL>
...