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

时间:2014-04-16 00:04:58

标签: sql oracle plsql

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

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

来自MSSQL:选择'foobar'作为'列标题'

来自SQLPlus:选择'foobar'为双列的“列标题”;

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;

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

由于您来自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;