【问题标题】:Oracle: Renaming column headers from stored procedureOracle:从存储过程重命名列标题
【发布时间】:2014-04-16 00:04:57
【问题描述】:

这应该是微不足道的,但出于某种原因,我正在摸不着头脑。

我只想为从存储过程返回的行集分配一个列名。不幸的是,在 Oracle SQL Developer 中创建的存储过程中使用 SQLPlus 中的语法会产生编译器错误。

来自 MSSQL: SELECT 'foobar' as 'Column Header'

来自 SQLPlus: SELECT 'foobar' as "Column Header" from dual;

Oracle SQL Developer Sproc:

CREATE OR REPLACE PROCEDURE sproc01 AS
BEGIN
   SELECT 'foobar          ' as "Column Header" from dual;
END sproc01;

Error(3,3): PLS-00428: an INTO clause is expected in this SELECT statement

这也会失败并出现同样的错误 -

CREATE OR REPLACE PROCEDURE PROCEDURE1 AS 
MyValue NVARCHAR2(40) := 'foobar    ';
BEGIN
  select MyValue as "My Value" from dual;
END PROCEDURE1;

有什么建议吗?

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    在 PL/SQL 过程中,您必须在某处分配结果。例如,它可能是可变的。这就是为什么它抱怨缺少INTO 子句。它与列名无关。

    【讨论】:

      【解决方案2】:

      由于您来自 SQL Server 背景,需要意识到的重要事项之一是存储过程(12c 之前的版本)不能返回隐式结果集。您可以将具有sys_refcursor 的存储过程定义为OUT 参数或返回sys_refcursor 的函数

      CREATE OR REPLACE PROCEDURE my_proc( p_rc OUT SYS_REFCURSOR )
      AS
      BEGIN
        OPEN p_rc 
         FOR SELECT 'foobar' as "Column Header"
               FROM dual;
      END;
      

      CREATE OR REPLACE FUNCTION my_func
        RETURN SYS_REFCURSOR
      IS
        l_rc sys_refcursor;
      BEGIN
        OPEN l_rc
         FOR SELECT 'foobar' as "Column Header"
               FROM dual;
        RETURN l_rc;
      END;
      

      不过,将此逻辑嵌入视图而不是 PL/SQL 块中会更常见

      CREATE VIEW my_view
      AS
      SELECT 'foobar' as "Column Header"
        FROM dual;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 2013-01-05
        • 2011-01-11
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        相关资源
        最近更新 更多