Oracle:从存储过程重命名列标题

Posted

技术标签:

【中文标题】Oracle:从存储过程重命名列标题【英文标题】:Oracle: Renaming column headers from stored procedure 【发布时间】: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;

有什么建议吗?

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于Oracle:从存储过程重命名列标题的主要内容,如果未能解决你的问题,请参考以下文章

在不停机的情况下重命名现有列

使用 DACPAC,当表上有触发器时,如何重命名列?

从另一个存储过程 oracle 调用存储过程

从 C# 调用 Oracle 存储过程?

从 Sql Server 2008 执行 oracle 存储过程

找出从哪里调用存储过程 - [Oracle]