【问题标题】:Stored Procedure Related存储过程相关
【发布时间】:2014-11-13 19:47:05
【问题描述】:
我正在 oracle 中创建一个从登录表中选择记录的存储过程 -
create or replace procedure login_info
(username IN varchar2, password IN varchar2, result OUT number)
as
begin
select * from login;
end;
每当我要编译它时,它都会显示一个错误:
PLS-00428:此 SELECT 语句中需要一个 INTO 子句
这是什么意思?这个我不明白。
【问题讨论】:
标签:
oracle
stored-procedures
procedure
【解决方案1】:
PLS-00428:此 SELECT 语句中需要一个 INTO 子句
这意味着当您从 PL/SQL 发出裸 SELECT 时,您需要关闭 INTO。
:D
更具建设性:您认为您的选择结果会在该代码片段中的哪个位置出现?
create or replace procedure login_info
(username IN varchar2, password IN varchar2, result OUT number)
as
begin
select * from login;
end;
您必须以某种方式检索它才能被您的 PL/SQL 代码处理。假设你有几行要收集,你应该使用BULK COLLECT INTO:
create or replace procedure login_info
(username IN varchar2, password IN varchar2, result OUT number)
as
type my_tbl_type IS TABLE OF login%ROWTYPE;
my_tbl my_tbl_type;
begin
select * BULK COLLECT INTO my_tbl from login;
-- do whatever you
-- need here
-- on `my_tbl`.
end;
作为最后一点,也许您正在寻找一个明确的CURSOR?你应该明确地看看PL/SQL 101: Working with Cursors。这是一个关于SELECT ... INTO ... 和CURSOR 操作的有趣讨论。
【解决方案2】:
您必须将 SELECT 语句的结果存储到变量中,您可以使用 sys_refcursor 来显示结果。
create or replace procedure login_info
(username IN varchar2, password IN varchar2, result OUT number, result_out OUT SYS_REFCURSOR)
as
l_query varchar2(1000) := Null;
begin
l_query := 'select * from login';
open result_out
for l_query;
end;
上面的代码会给你输出