哦,平常建存儲(chǔ)過程時(shí),阿堂就是直接用ldquo;create or replace procedure 存儲(chǔ)過程名rdquo; 這樣的形式來建的,沒遇到什么問題
哦,平常建存儲(chǔ)過程時(shí),阿堂就是直接用“create or replace procedure 存儲(chǔ)過程名” 這樣的形式來建的,沒遇到什么問題,這不,這兩天在項(xiàng)目中嘗試用包的形式,建存儲(chǔ)過程時(shí)就遇到了實(shí)際問題,在PL/SQL中運(yùn)行命令后,沒有什么編譯錯(cuò)務(wù)。運(yùn)行完畢,再在pl/sql中看時(shí),就會(huì)一個(gè)該包上有一個(gè)紅色的x,暈了。要看上面的錯(cuò)誤提示,,是出現(xiàn)在下面建 create or replace package body display_users_package is時(shí),在create上報(bào)錯(cuò)。一看,關(guān)健字書寫沒錯(cuò)誤啊。其實(shí),后來找到原因后,回個(gè)頭來思考,上面這個(gè)提示是非常正確的。(其意思就是告訴我們,建包時(shí),下面不能把建包body的命令放在一起運(yùn)行的,言外之意,就是要?jiǎng)h除中間開始的從create or replace package body display_users_package is 到后面的所有語句,即可)
這里,要感謝部門同事"木生"了,是他幫忙找到的錯(cuò)誤原因了
在網(wǎng)上的文章介紹,建包,包主體,及存儲(chǔ)過程時(shí),代碼都全放在一起了,基本上沒有什么說明,所以,一般人就以為這些命令是一起在運(yùn)行了。
我運(yùn)行代碼時(shí)報(bào)錯(cuò)時(shí),完整代碼如下
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;
事實(shí),“運(yùn)行建包”和“運(yùn)行建包主體”的命令是要分開的。為什么這樣說,其實(shí),仔細(xì)看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中建用這樣含有包的存儲(chǔ)過程時(shí),用如下形式
包名.存儲(chǔ)過程名
CallableStatement cs = null;
cs = conn.prepareCall("call display_users_package.display_users_proc(?,?)");
cs.registerOutParameter (1, OracleTypes.CURSOR);
cs.setObject(2, params);
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com