我对Oracle中的存储过程语法感到有些困惑。
我从一个简单的开始:
select * from test_table;
它有效,然后我把它放在一个过程中:
CREATE OR REPLACE PROCEDURE example
IS
BEGIN
select * from test_table;
END;
不起作用。期待" INTO"是我收到的错误消息。现在,我已经看到SQL Server代码的语法示例,它只是将一个select语句推送到一个proc中,它立即起作用,但这似乎不是这里的情况。
答案 0 :(得分:7)
T-SQL和PL / SQL是完全不同的语言。特别是,对于PL / SQL,您必须将结果选择为某个变量或游标。根据您计划对记录数据执行的操作 - 程序中的处理 - 或返回给调用者,将驱动您必须执行的操作。
在您的示例中,如果要返回记录集,则可以执行以下操作:
CREATE OR REPLACE PROCEDURE example (
p_recordset OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_recordset FOR
select * from test_table;
END example ;
有关示例,请参阅this link。
答案 1 :(得分:1)
您好,欢迎来到SO
我假设您看到的完整错误是PLS-00428: an INTO clause is expected in this SELECT statement
,并且它是正确的,您必须在存储过程中使用INTO
语句。
我建议使用this链接获取与SELECT INTO
语句相关的语法
对于您的代码,我建议您(我已将test_table
示例更改为dba_user):
CREATE OR REPLACE PROCEDURE example
IS
l_username VARCHAR(25);
BEGIN
select username INTO l_username from dba_users where user_id=1;
END;
/
注意: INTO
子句适用于1行中的 1 列。您无法在此选择多个记录或列。您需要引用BULK COLLECT
功能才能执行此操作。有关这方面的示例,请随时阅读here。
答案 2 :(得分:1)
从test_table中选择*;
SQL 和 PL / SQL 也不尽相同。要在过程中执行SQL,解析器需要 INTO 子句来存储sql语句返回的值。在PL/SQL
中,有理由执行SQL语句。您希望稍后使用结果集进行处理。不只是检索并且什么都不做。
此外,在任何生产系统中使用select *
都是一个坏主意。您不希望在应用程序屏幕上转储表的所有列数据。然而,还有许多其他原因,不在本问题的范围内。
您需要修改SQL,如下所示 -
SELECT column_name INTO variable FROM table_name
有几种方法可以通过PL / SQL中的SQL语句获取数据。您需要详细说明您的要求,并在此处缩小到具体步骤。
如果您正在了解这些概念,我建议您先开始阅读Oracle文档。尝试并理解这些概念,如果您发现任何问题,请准备一个测试用例,用文字解释您的问题,然后发布问题。太广泛的问题难以回答,并且大多被认为超出了范围。