哦,平常建存儲過程時,阿堂就是直接用ldquo;create or replace procedure 存儲過程名rdquo; 這樣的形式來建的,沒遇到什么問題
哦,平常建存儲過程時,阿堂就是直接用“create or replace procedure 存儲過程名” 這樣的形式來建的,沒遇到什么問題,這不,這兩天在項目中嘗試用包的形式,建存儲過程時就遇到了實際問題,在PL/SQL中運行命令后,沒有什么編譯錯務。運行完畢,再在pl/sql中看時,就會一個該包上有一個紅色的x,暈了。要看上面的錯誤提示,,是出現在下面建 create or replace package body display_users_package is時,在create上報錯。一看,關健字書寫沒錯誤啊。其實,后來找到原因后,回個頭來思考,上面這個提示是非常正確的。(其意思就是告訴我們,建包時,下面不能把建包body的命令放在一起運行的,言外之意,就是要刪除中間開始的從create or replace package body display_users_package is 到后面的所有語句,即可)
這里,要感謝部門同事"木生"了,是他幫忙找到的錯誤原因了
在網上的文章介紹,建包,包主體,及存儲過程時,代碼都全放在一起了,基本上沒有什么說明,所以,一般人就以為這些命令是一起在運行了。
我運行代碼時報錯時,完整代碼如下
create or replace package xinfei_ims.display_users_package is
type search_results is ref cursor;
procedure display_users_proc(results_out out search_results,userId in test_users.user_id%type);
end display_users_package;
create or replace package body display_users_package is
procedure display_users_proc(results_out out search_results, userId in test_users.user_id%type) is
begin
if userId is not null then
open results_out for select * from test_users where user_id like userId||'%';
else
open results_out for select * from test_users;
end if;
end display_users_proc;
end display_users_package;
事實,“運行建包”和“運行建包主體”的命令是要分開的。為什么這樣說,其實,仔細看PL/SQL中左邊的菜單就可以看出,Oracle中 PACKAGE和PACKAGE BOYIES是分開的,從下面圖示中就可以看出
建PACKAGE
create or replace package display_users_package is
type search_results is ref cursor;
procedure display_users_proc(results_out out search_results,
userId in test_users.user_id%type);
end display_users_package;
建PACKAGE BODY
create or replace package body display_users_package is
procedure display_users_proc(results_out out search_results, userId in test_users.user_id%type) is
begin
if userId is not null then
open results_out for select * from test_users where user_id like userId||'%';
else
open results_out for select * from test_users;
end if;
end display_users_proc;
end display_users_package;
在JAVA中建用這樣含有包的存儲過程時,用如下形式
包名.存儲過程名
CallableStatement cs = null;
cs = conn.prepareCall("call display_users_package.display_users_proc(?,?)");
cs.registerOutParameter (1, OracleTypes.CURSOR);
cs.setObject(2, params);
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com