这应该是微不足道的,但由于某些原因,我正在摸不着头脑。
我只想为从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;
有什么建议吗?
答案 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;