PL/SQL中斜线(/)与输入参数的用法

日期: 2011-08-23 作者:Dan Clamage翻译:孙瑞 来源:TechTarget中国 英文

问:我是一名新入行的DBA,对于PL/SQL语句运用还不熟练。我们公司最近刚刚安装了Oracle 10g数据库,当我试图执行下面的PL/SQL语句时,发生了错误:   create or replace procedure raja AS V_name varchar2(30);   V_age number(15); V_employee_id number(15);   Begin select name, age, employee_id ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:我是一名新入行的DBA,对于PL/SQL语句运用还不熟练。我们公司最近刚刚安装了Oracle 10g数据库,当我试图执行下面的PL/SQL语句时,发生了错误:

  create or replace procedure raja AS V_name varchar2(30);
  V_age number(15); V_employee_id number(15);
  Begin select name, age, employee_id into V_name,V_age,V_employee_id from employee where employee_id= 1;
  dbms_output.put_line('V_name'|| V_age || V_employee_id);
  end;

  Error_message: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: ( ; is with authid as cluster compress order using compiled wrapped external deterministic parallel_enable pipelined The symbol ";" was substituted for "end-of-file" to continue.

  请您帮我解决一下这个问题,谢谢!

  答:来看下代码的最后一行,所有的PL/SQL块,包括子程序在遇到斜线(/)时都会终止。斜线的意思就是“执行,Execute”,从上世纪70年代IBM发明SQL语句时就已经是这样了。我对你的程序进行了一点修改,删除了v_name变量的单引号,并对输出进行了一定的美化:

SQL> create table employee ( 2 name varchar2(30), age number(15), employee_id number(15) 3 ); Table created. SQL> CREATE OR REPLACE PROCEDURE raja 2 AS 3 v_name VARCHAR2(30); 4 v_age NUMBER(15); 5 v_employee_id NUMBER(15); 6 BEGIN 7 SELECT name, age, employee_id 8 INTO v_name, v_age, v_employee_id 9 FROM employee 10 WHERE employee_id = 1; 11 12 DBMS_OUTPUT.put_line(v_name || ': ' || v_age || ',' || v_employee_id); 13 END raja; 14 / Procedure created. -- insert a row SQL> INSERT INTO employee 2 VALUES ( 3 'Raja' 4 ,27 5 ,1 6 ); 1 row created. SQL> set serveroutput on size 1000000 format wrapped -- run the stored procedure SQL> BEGIN 2 raja; 3 END; 4 / Raja: 27,1 PL/SQL procedure successfully completed.

  关于你的程序,我有一些其他的建议:你可以将变量固定在一个实际表列中,这样的话如果列有变更,你可以不用再重新修改代码就可以获得相应的变更了。因此可以改成下面这样:

v_name VARCHAR2(30); v_age NUMBER(15); v_employee_id NUMBER(15); becomes v_name employee.name%type; v_age employee.age%type; v_employee_id employee.employee_id%type;

  或者更加简洁:

v_rec employee%rowtype; -- reference elements as v_rec.name, v_rec.age, v_rec.employee_id

  添加一些异常处理,如果没发现行,那么你可以获得一个未处理的异常:

SQL> delete from employee; 1 row deleted. SQL> BEGIN 2 raja; 3 END; 4 / BEGIN * ERROR at line 1: ORA-01403: no data found ORA-06512: at "SCOTT.RAJA", line 7 ORA-06512: at line 2

  你可以添加一个异常处理程序来显示有用的信息:

EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line('Sorry, that employee does not exist!'); end raja;

  使用一个输入参数让过程一般化将会非常实用,比如提供一个employee_id,你可以进行查询:

CREATE OR REPLACE PROCEDURE raja(p_employee_id IN employee.employee_id%TYPE) AS v_rec employee%ROWTYPE; BEGIN SELECT * INTO v_rec FROM employee WHERE employee_id = p_employee_id; DBMS_OUTPUT.put_line( v_rec.name || ': ' || v_rec.age || ',' || v_rec.employee_id ); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.put_line( 'Sorry, employee_id ' || p_employee_id || ' not found!' ); END raja; / SQL> BEGIN 2 raja(1); 3 END; 4 / Sorry, employee_id 1 not found! PL/SQL procedure successfully completed. SQL> INSERT INTO employee 2 VALUES ( 3 'Raja' 4 ,27 5 ,1 6 ); 1 row created. SQL> BEGIN 2 raja(1); 3 END; 4 / Raja: 27,1 PL/SQL procedure successfully completed. SQL> INSERT INTO employee VALUES ('Dan', 49, 2); 1 row created. SQL> BEGIN 2 raja(2); 3 END; 4 / Dan: 49,2 PL/SQL procedure successfully completed.

翻译

孙瑞
孙瑞

相关推荐