oracle存储过程

eiee3dmh  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(392)

我对oraclesql还比较陌生。我正在尝试创建一个包含两个参数的存储过程。我在下面保存时出错。你知道吗?

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 ;
0aydgbwb

0aydgbwb1#

这里的版本已更正

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
执行变量的方法是立即执行
您可以使用create或replace force view代替alter view

1szpjjfi

1szpjjfi2#

在这里,您似乎混合了sql server和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;
/
sg2wtvxw

sg2wtvxw3#

我已经采取了你的程序和修改如下,看看它是否有效。另外,我想说的是,您可以在过程中显式地执行异常处理,以捕获执行过程中的任何错误,并且使用“*”创建视图也有一些缺点。请查查

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;
/

相关问题