【问题标题】:Oracle stored procedure with parameter带参数的Oracle存储过程
【发布时间】:2020-08-03 15:29:26
【问题描述】:

我对 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 ;

【问题讨论】:

    标签: sql string oracle stored-procedures plsql


    【解决方案1】:

    这里的版本更正

    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 OR REPLACE FORCE VIEW 而不是 ALTER VIEW

    【讨论】:

      【解决方案2】:

      您似乎在这里混合了 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;
      /
      

      【讨论】:

      • 我在编译代码时收到以下错误:错误:PL/SQL:编译单元分析终止错误(3,14):PLS-00201:必须声明标识符“NVARCHAR”
      • 尝试使用'NVARCHAR2'。
      • @AndyDan:谢谢,现在看来确实可行:dbfiddle.uk/…
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-17
        • 2013-11-02
        • 2011-10-08
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        相关资源
        最近更新 更多