Oracle хранимая процедура с параметром - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в Oracle SQL. Я пытаюсь создать хранимую процедуру, которая принимает 2 параметра. Я получаю ошибки при сохранении ниже. Есть идеи?

CREATE OR REPLACE PROCEDURE SWAP_VIEWS 
(
  SchemaName NVARCHAR,
  TableName NVARCHAR
) AS 
BEGIN
  DECLARE SQLstring NVARCHAR :=
      'ALTER VIEW  AS POL.V_' + TableName + ' as SELECT * FROM ' + SchemaName + '.' + TableName
  EXEC SQLstring;
END SWAP_VIEWS ;

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

Здесь исправлена ​​версия

CREATE OR REPLACE PROCEDURE SWAP_VIEWS 
(
  SchemaName NVARCHAR,
  TableName NVARCHAR
) AS 
SQLstring varchar2(4000);
BEGIN

 SQLstring := 'CREATE OR REPLACE FORCE VIEW POL.V_' || TableName || ' as SELECT * FROM ' || SchemaName || '.' || TableName ' ;
 EXECUTE IMMEDIATE SQLstring;
  
END SWAP_VIEWS ;
/
  • Символ конкатенации: |
  • Должна быть объявлена ​​переменная SQLString
  • Способ выполнения переменной - EXECUTE IMMEDIATE
  • Вы можете использовать CREATE OR REPLACE FORCE VIEW вместо ALTER VIEW
1 голос
/ 03 августа 2020

Кажется, вы смешиваете синтаксис SQL Server и Oracle здесь:

  • Oracle использует стандартный оператор || для конкатенации строк, а не +

  • Oracle хочет EXECUTE IMMEDIATE вместо EXEC

  • вам нужно CREATE OR REPLACE VIEW

  • NVARCHAR2 должно быть предпочтительнее NVARCHAR

Обратите внимание, что вам не нужно промежуточное присвоение переменной, вы можете объединить строку запроса и выполнить ее сразу.

Считайте:

CREATE OR REPLACE PROCEDURE SWAP_VIEWS (
  pSchemaName NVARCHAR2,
  pTableName  NVARCHAR2
) AS 
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW  AS POL.V_' 
    || pTableName + ' as SELECT * FROM ' 
    || pSchemaName || '.' || pTableName;
END;
/
0 голосов
/ 03 августа 2020

Я взял вашу процедуру и изменил ее, как показано ниже, посмотрите, работает ли она. Кроме того, я хочу сказать, что вы можете явно выполнять обработку исключений в процедуре, чтобы зафиксировать любую ошибку во время выполнения, а также создание представления с помощью '*' имеет некоторые недостатки. Пожалуйста, отметьте

CREATE OR REPLACE PROCEDURE SWAP_VIEWS 
(
  p_schema_name IN NVARCHAR2,
  p_table_name  IN NVARCHAR2
)
IS
    lo_sql_string NVARCHAR2(4000);
    lo_view_name NVARCHAR2(30);
    lo_table_name NVARCHAR2(30);
BEGIN
    -- I just prefer local variables for convenience to avoid more complex string in actual one and also for debugging purpose
    lo_view_name := 'POL.V_'||p_table_name;
    lo_table_name := p_schema_name||'.'||p_table_name;
    lo_sql_string:= 'create or replace view '||lo_view_name||
                               ' as '||
                               'select * from '||lo_table_name;
  
    EXECUTE IMMEDIATE lo_sql_string;
END SWAP_VIEWS;
/
...