问:我是一名新入行的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中国
问:我是一名新入行的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. |
作者
翻译
相关推荐
-
Collaborate 18大会:了解甲骨文云数据库和应用的进展
在Collaborate 18大会即将举行时,我们会发现,甲骨文用户社区的技术变化会略高于平常水平。 由独立甲 […]
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
Oracle TNS 错误:管理员旷日持久的战斗
TNS经常给IT管理员带来麻烦,而且很难定位。尤其是在Oracle数据库中。本文将介绍如何避免这些常见错误。
-
DBA支招:如何实现Oracle EBS 12.2.5升级
那些对于是否要将EBS进行升级持观望态度的Oracle数据库管理员们可以从一家研究公司获得一些启示。