选择存储过程plsql

时间:2015-02-02 13:44:24

标签: sql database oracle stored-procedures plsql

我对Oracle中的存储过程语法感到有些困惑。

我从一个简单的开始:

select * from test_table;

它有效,然后我把它放在一个过程中:

CREATE OR REPLACE PROCEDURE example
IS
BEGIN
   select * from test_table;
END;

不起作用。期待" INTO"是我收到的错误消息。现在,我已经看到SQL Server代码的语法示例,它只是将一个select语句推送到一个proc中,它立即起作用,但这似乎不是这里的情况。

3 个答案:

答案 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文档。尝试并理解这些概念,如果您发现任何问题,请准备一个测试用例,用文字解释您的问题,然后发布问题。太广泛的问题难以回答,并且大多被认为超出了范围。