在创建存储过程的时候,我本想在存储过程添加一些提示语句,例如提示用户输入什么啊,举例如下:create or replace procedure pro_temp is
begin
  set serveroutput on;  
  dbms_output.put_line('请用户输入:……');
end pro_temp;编译的时候,出现下面的错误:PROCEDURE QIUYUE.PRO_TEMP 编译错误
错误:PL/SQL: ORA-00922: 选项缺失或无效
行:3
文本:set serveroutput on;错误:PL/SQL: SQL Statement ignored
行:3
文本:set serveroutput on;之所以想通过“set serveroutput on”打开服务器输出,是为了避免忘记在命令行窗口打开,所以才想在存储过程中添加,不知道怎么弄,求教,谢谢!
不知道这个问题有没有用,谢谢!

解决方案 »

  1.   


    create or replace procedure pro_temp is
    begin
      set serveroutput on;
      dbms_output.put_line('请用户输入:……');
    end pro_temp;
      

  2.   

    不可以这样做的,set serveroutput on命令是不可以放在存储过程中执行的
      

  3.   

    set serveroutput on;create or replace procedure pro_temp is
    begin
      dbms_output.put_line('请用户输入:……');
    end pro_temp;
      

  4.   

    这是 sqlplus 命令,不可以放在存储过程中。
      

  5.   


    如果你怕忘记打开或者嫌麻烦,可以把 set serveroutput on 写在
    D:\oracle\product\10.2.0\db_1\sqlplus\admin\glogin.sql 中,因为sqlplus打开的时候会自动加载这个文件。
      

  6.   

    在存储过程中好像并不推荐用dbms_output 函数, 好像会引起内存泄露
      

  7.   

    原来dbms_output 函数还会引起内存泄露啊?这么说的话,以后再经常执行的存储过程中,尽量少用dbms_output 函数了?
      

  8.   

    可以,比如我这里一登陆sqlplus 显示 [SYS@myoracle] SQL> 也是在这个文件里做的
     
    C:\Users\thinkpad-zph>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on 星期日 8月 12 14:47:53 2012Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    连接到:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options[SYS@myoracle] SQL>
      

  9.   

    奥,这样的!那这个文件应该只是sql/plus工具启动要读取的文件吧?今天我设置之后,用sql/plus登录的时候,果真不需要输入“set serveroutput on”打开服务器输出,但是如果是使用PL/SQL的话,还是不行,所以我想PL/SQL应该也有类似的文件,于是我就在PL/SQL中查找,找到了一个login.sql文件,在上面添加了“set serveroutput on”之后,现在我的PL/SQL也自动可以自动完成了。谢谢啊!
    但是你那个自动显示登录用户和数据库名的方式,我还 不知道怎么弄的呢?求教!
      

  10.   


    set sqlprompt "'['_USER'@'_CONNECT_IDENTIFIER'] SQL>'"
      

  11.   

    不好意思啊,我尝试了好久,还是不可以,我感觉这些可以直接在命令窗口先演示以下,例如,显示登录的用户名,按照你说的应该是:SQL> set sqlprompt "_user";  --使用双引号不可以
    _user> set sqlprompt '_user';  --使用单引号不可以
    _user> set sqlprompt _user;  --不适用符号也不可以
    _user> 我想,使用上面的几种方式应该可以测试你给我说的方法吧?但是怎么不可以呢?求教,谢谢!麻烦了!
      

  12.   

    set sqlprompt "_USER"
    SQL>set sqlprompt "'['_USER'@'_CONNECT_IDENTIFIER'] SQL>'"
    [SYS@myoracle] SQL>
      

  13.   


    [SYS@myoracle] SQL>set sqlprompt "_USER"
    SYS
    SYS/
      

  14.   

    我通过查看自己的define变量,可以查看到“_user”的内容,如下:SQL> define _user;
    DEFINE _USER            = "QIUYUE" (CHAR)但是,当我直接复制你给我说的东西的时候,却发现,直接显示的是字符串"_user",这到底是怎么回事啊?
    后来跑到SQL/Plus上才发现可以,晕!难道说“set sqlprompt”在SQL/Plus和PL/SQL中并不完全一样?
      

  15.   


    恩,,一般不推荐这个,,可以用sys自带的utl_file 来写LOG文件来完成。。如果仅仅是私下调试的话 dbms_output 还是比较方便的