在oracle SQL中完成匿名块

时间:2014-03-13 22:05:22

标签: oracle plsql

尝试按如下方式创建查询游标时:

DECLARE CURSOR Query1
IS
SELECT * FROM RACE 
WHERE Race_Time='22-SEP-14 12.00.00.000000000'; 
BEGIN
OPEN Query1;
END;

我收到以下错误。匿名块完成。有谁知道如何解决这一问题?我试过设置  ' SET SERVEROUTPUT ON;' 在声明之前,但这似乎没有修复错误。提前谢谢!

3 个答案:

答案 0 :(得分:4)

似乎dbms_output已关闭

如果你将SET SERVEROUTPUT ON;放在脚本的开头,你可以看到你。

或者您可以查看dbms_output窗口(查看然后DBMS输出)然后按" +"在Dbms Output窗口的顶部,然后选择一个打开的数据库

答案 1 :(得分:1)

“匿名块已完成”表示您的PL / SQL代码已成功执行。 要显示:尝试使用输出语句...

例如:

 BEGIN
    dbms_output.put_line ('Hello, world!');
END;

答案 2 :(得分:1)

如果要在PL / SQL中控制进程,可以执行类似

的操作
DECLARE 
  l_race_rec race%rowtype;

  CURSOR Query1
  IS
    SELECT * 
      FROM RACE 
     WHERE Race_Time='22-SEP-14 12.00.00.000000000'; 
BEGIN
  OPEN Query1;
  LOOP
    FETCH query1 INTO l_race_rec;
    EXIT WHEN query1%notfound;

    dbms_output.put_line( l_race_rec.column1 || ' ' || l_race_rec.column2 || ... || l_race_rec.columnN );
  END LOOP;
  CLOSE Query1;    
END;

除非你的作业需要使用显式游标,否则隐式游标可能更容易使用

BEGIN
  FOR x IN( SELECT * 
              FROM RACE 
             WHERE Race_Time='22-SEP-14 12.00.00.000000000')
  LOOP
    dbms_output.put_line( x.column1 || ' ' || x.column2 || ... || x.columnN );
  END LOOP;
END;

如果您使用的是SQL * Plus,您还可以执行类似

的操作
VAR rc REFCURSOR;
BEGIN
  OPEN :rc
   FOR SELECT *
         FROM race
        WHERE race_time = '22-SEP-14 12.00.00.000000000'; 
END;
PRINT rc

如果race_time真的是timestamp,您应该将timestamp与另一个timestamp进行比较,而不是将timestamp与字符串进行比较。使用带有显式格式掩码的显式转换,以避免由于具有不同NLS设置的不同会话而导致的错误

WHERE race_time = to_timestamp( '22-SEP-14 12.00.00.000000000', 
                                'DD-MON-RR HH24:MI:SS.FF9' )

当然,我不确定为什么你会在这里首先使用timestamp - 你似乎不太可能知道比赛开始的纳秒。