【问题标题】:Oracle Procedure error (PLS-00428)Oracle 过程错误 (PLS-00428)
【发布时间】:2013-01-07 19:59:30
【问题描述】:

这是错误信息:PLS-00428: an INTO clause is expected in this SELECT statement. 同时,这是测试显示系统日期的过程:

CREATE OR REPLACE 
PROCEDURE "TEST_PROCEDURE"
AS
BEGIN
    SELECT SYSDATE FROM DUAL;
END;

首先,我不需要使用INTO Oracle 坚持让我这样做。除了使用光标之外还有其他方法吗(我在这里看到过https://stackoverflow.com/a/6029963/1983024)?我认为不应该是这样,这确实像在 MS SQL 中一样正常运行,无需使用INTO 或游标。

【问题讨论】:

  • 你用这个作为触发器吗?
  • 不,先生,一切都很新鲜(还没有表格、触发器、序列等),我只是在这里测试程序。
  • Oracle 不像 MS SQL 这样工作。该过程不能只将 Table 的内容吐出到 SQL*Plus 结果面板中
  • 感谢@cha 提供的信息,但是您有什么建议?另外,我这里还没有指表,我只是在执行一个系统函数。
  • 如果您的对象只是为了编译过程,请声明一个变量并将 SYSDATE 存储在那里。如果您想在 SQL*Plus 中显示,请使用链接中提供的解决方案。

标签: sql plsql oracle10g procedure


【解决方案1】:

首先,我不需要使用 INTO Oracle 坚持的 由我来做。

事实是,Oracle 是正确的:您确实需要使用 INTO 来获取返回值。

毕竟,如果你想显示查询的结果,你首先需要一个变量。

【讨论】:

  • 对不起,我只是在这种情况下真的不需要它,我指的是 MS SQL 可以简单地选择某个值然后显示它就是这样,并比较 Oracle 是如何做到的。不过,感谢您提供的信息。
  • 嗯,你确实说过你想“显示”系统日期,所以,是的,你真的需要它! :)
【解决方案2】:

你可以写

CREATE OR REPLACE 
PROCEDURE "TEST_PROCEDURE"
AS
BEGIN
for r_row in ( SELECT SYSDATE s FROM DUAL)
  dbms_output.put_line(r_row.s);
end loop;
END;

或者你必须有一个变量。

CREATE OR REPLACE 
PROCEDURE "TEST_PROCEDURE"
AS
  v_Date date;
BEGIN
    SELECT SYSDATE into v_date FROM DUAL;
  dbms_output.put_line(v_date );

END;

输出格式由您的NLS_DATE_FORMAT 设置决定,或者您可以像to_char(v_date, 'dd-mm-yyyy') 等那样明确。

【讨论】:

  • +1 用于包含循环选项。我的情况需要一个循环。
【解决方案3】:

终于找到了我想要的输出的解决方案(根据您的回复):D

CREATE OR REPLACE 
PROCEDURE "TEST_PROCEDURE"
RET_DATE CHAR(10);
BEGIN
    SELECT TO_CHAR(SYSDATE, 'MM/DD/YYYY') INTO RET_DATE FROM DUAL;
    DBMS_OUTPUT.PUT_LINE(RET_DATE);
END;

这将显示格式为 MM/DD/YYYY 的 SYSDATE。不过,感谢您的回复和想法(主要是@Jeffrey Kemp)。 Oracle 只是延长了 MS SQL 通常可以在一行中执行的操作:D

【讨论】:

    【解决方案4】:

    你可以像这样使用

    CREATE OR replace PROCEDURE Test_procedure
    IS
      date CHAR(10);
    BEGIN
        SELECT To_char(SYSDATE, 'MM/DD/YYYY')
        INTO   date
        FROM   dual;
    
        dbms_output.Put_line(date);
    END; 
    

    它将日期返回为字符格式。

    如果您想将日期转换为日期格式,只需声明日期类型变量,然后将 sysdate 值分配给该变量。然后使用 DBMS_OUTPUT.PUT_LINE(variable) 打印 DATE。

    【讨论】:

      【解决方案5】:

      如果你想在一行中完成,你也可以使用:

      CREATE OR replace PROCEDURE Test_procedure
      IS
      BEGIN
        dbms_output.put_line(to_char(sysdate, 'MM/DD/YY'));
      END;
      

      【讨论】:

        猜你喜欢
        • 2015-02-07
        • 2012-09-03
        • 2021-11-05
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        相关资源
        最近更新 更多