1.初始化外部函數(shù)
創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十多年,專業(yè)且經(jīng)驗(yàn)豐富。十多年網(wǎng)站優(yōu)化營銷經(jīng)驗(yàn),我們已為上1000+中小企業(yè)提供了成都做網(wǎng)站、網(wǎng)站建設(shè)解決方案,定制網(wǎng)站制作,設(shè)計(jì)滿意,售后服務(wù)無憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!
就是說明包含外部函數(shù)的動(dòng)態(tài)鏈接庫的位置,并從中分離出外部函數(shù)的原型,并將外部函數(shù)中主語言的數(shù)據(jù)類型和PL/SQL數(shù)據(jù)類型做一一對(duì)應(yīng)的匹配。這是在包體(PackageBody)中進(jìn)行的。具體分以下幾步:
(1)用OQA_FFI.LOAD_LIBRARY得到包含外部函數(shù)的動(dòng)態(tài)鏈接庫的庫柄,此時(shí)需提供動(dòng)態(tài)鏈接庫的名字和位置。
(2)用ORA_FFI.REGISTER_FUNCTION得到外部函數(shù)的函數(shù)柄,這時(shí)需提供動(dòng)態(tài)鏈接庫的庫柄和外部函數(shù)名。
(3)用ORA_FFI.REGISTER_PARAMETER來注冊(cè)外部函數(shù)的參數(shù)類型,對(duì)每一個(gè)參數(shù)都要提供它的外部函數(shù)柄和相應(yīng)的PL/SQL數(shù)據(jù)類型。參數(shù)注冊(cè)的順序必須與它們出現(xiàn)在外部函數(shù)原型中的順序一致。
(4)用ORA_FFI.REGISTER_RETURN來注冊(cè)外部函數(shù)的返回值類型,這時(shí)需要提供它的外部函數(shù)柄和相應(yīng)的PL/SQL數(shù)據(jù)類型。
2.將外部函數(shù)和一個(gè)PL/SQL子程序相關(guān)聯(lián)
一個(gè)和外部函數(shù)建立關(guān)聯(lián)的PL/SQL子程序,實(shí)際上指明了外部函數(shù)的內(nèi)存地址,每次調(diào)用這個(gè)子程序,實(shí)際上是調(diào)用與它相對(duì)應(yīng)的外部函數(shù)。具體步驟為:
(1)用ORA_FFI.FIND_FUNCTION或ORA_FFI.REGISTER_FUNCTION得到一個(gè)函數(shù)柄。
(2)在PL/SQL包體的聲明部分,定義一個(gè)PL/SQL子程序,它的第一個(gè)參數(shù)是類型為ORA_FFI.FUNCHANDLETYPE,接下來是依次對(duì)應(yīng)外部函數(shù)參數(shù)的PL/SQL數(shù)據(jù)類型的參數(shù)。
(3)在這個(gè)PL/SQL子程序中加入一個(gè)PRAGMA接口。PRAGMA聲明就是通過將控制轉(zhuǎn)到一個(gè)內(nèi)存地址,來激活這個(gè)外部函數(shù)。
3.生成一個(gè)模仿外部函數(shù)的原型的PL/SQL子程序。
這個(gè)子程序就是用戶可見的外部函數(shù)的PL/SQL接口,用戶按照它的參數(shù)類型和返回值類型來使用外部函數(shù),具體步驟為:
(1)在包體的聲明部分,定義一個(gè)PL/SQL子程序,它的參數(shù)和返回值是和外部函數(shù)對(duì)應(yīng)的PL/SQL類型。這就是模仿外部函數(shù)原型的一個(gè)子程序。
(2)在這個(gè)子程序中調(diào)用與上步生成的與外部函數(shù)相關(guān)聯(lián)的PL/SQL子程序。
(3)在PL/SQL包的說明(PackageSpefication)部分,輸入這個(gè)PL/SQL子程序的原型。
下面是一個(gè)完整的為WindowsAPI函數(shù)winexec建立PL/SQL接口的例子:
PACKAGEWinExecIS
FUNCTIONWinExec(ExecfileINVARCHAR2,
commandINPLS_INTEGER)
RETURNPLS_INTEGER;
END;/*在包說明部分,是模仿外部
函數(shù)原型的PL/SQL函數(shù)原型說明*/
PACKAGEBODYWinExecIS
lh_USERora_ffi.libHandleType;/*定義庫柄類型變量*/
fh_WinExecora_ffi.funcHandleType;/*定義函數(shù)柄類型變量*/
FUNCTIONi_WinExec(funcHandleINora_ffi.funcHandleType,
ExecfileINOUTVARCHAR2,
commandINPLS_INTEGER)
RETURNPLS_INTEGER;
PRAGMAINTERFACE(C,i_WinExec,11265);
/*步驟2將一個(gè)PL/SQL子程序與外部函數(shù)相關(guān)聯(lián)*/
FUNCTIONWinExec(ExecfileINVARCHAR2,
commandINPLS_INTEGER)
RETURNPLS_INTEGER
IS
execfile_lVARCHAR2(512):=Execfile;
rcPLS_INTEGER;
BEGIN
rc:=i_WinExec(fh_WinExec,
execfile_l,
command);
RETURN(rc);
END;
/*步驟3中PL/SQL模仿函數(shù)的定義,
它實(shí)際上就是調(diào)用步驟2中與外部函數(shù)建立關(guān)聯(lián)的那個(gè)函數(shù)*/
BEGIN
BEGIN
lh_USER:=ora_ffi.find_library('Kernel32.dll');
EXCEPTIONWHENora_ffi.FFI_ERRORTHEN
lh_USER:=ora_ffi.load_library(NULL,'kernel32.dll');
END;/*得到動(dòng)態(tài)鏈接庫的庫柄*/
fh_WinExec:=ora_ffi.register_function
(lh_USER,'WinExec',ora_ffi.PASCAL_STD);
/*得到外部函數(shù)的函數(shù)柄*/
ora_ffi.register_parameter(fh_WinExec,
ORA_FFI.C_CHAR_PTR);/*參數(shù)注冊(cè),原類型為LPCSTR*/
ora_ffi.register_parameter(fh_WinExec,
ORA_FFI.C_INT);/*參數(shù)注冊(cè),原類型為UINT*/
ora_ffi.register_return(fh_WinExec,
ORA_FFI.C_INT);/*返回值注冊(cè),原類型為BOOL*/
ENDWinExec;
可以將多個(gè)外部函數(shù)的PL/SQL接口放在一個(gè)包內(nèi)。要在Developer/2000的FormDesigner中使用這些外部函數(shù),只要把包含這一程序包的程序庫(.PLL)附加進(jìn)來,使用包名.函數(shù)名就可激活這個(gè)外部函數(shù)。
例如:WinExec.WinExec('c:\windows\notepad.exe',0)
具體WindowsAPI函數(shù)數(shù)據(jù)類型和PL/SQL數(shù)據(jù)類型的轉(zhuǎn)換可參照Developer/2000中ProcedureBuilder幫助文件中對(duì)ORA_FFI軟件包的詳細(xì)介紹。
1.創(chuàng)建Product Family
Product Family用于管理幾個(gè)功能相近的Product(也可以立即為模塊),統(tǒng)一管理客戶化的Webservice接口
begin
-- Call the procedure
ad_pa_insert_package.insert_ad_pm_product_info(x_product_abbreviation = 'os_xxx',
x_pseudo_product_flag = 'N',
x_product_family_flag = 'Y',
x_application_short_name = NULL,
x_product_name = 'Oracle Xxx Suite',
x_product_family_abbreviation = NULL,
x_product_family_name = NULL,
x_aru_update_date = to_char(SYSDATE,'yyyy-mm-dd
hh24:mi:ss'),
x_currdate = to_char(SYSDATE,'yyyy-mm-dd
hh24:mi:ss'),
x_last_updated_by = -1,
x_created_by = -1);
COMMIT;
end;
2.注冊(cè)Product,即注冊(cè)Xxx University(cux)應(yīng)用到產(chǎn)品家族中
begin
ad_pa_insert_package.insert_ad_pm_product_info(x_product_abbreviation = 'cux',
x_pseudo_product_flag = 'N',
x_product_family_flag = 'N',
x_application_short_name = 'CUX',
x_product_name = 'Xxx University',
x_product_family_abbreviation = NULL,
x_product_family_name = NULL,
x_aru_update_date = to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'),
x_currdate = to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'),
x_last_updated_by = -1,
x_created_by = -1);
COMMIT;
end;
3.關(guān)聯(lián)Xxx University應(yīng)用到產(chǎn)品家族Oracle Xxx Suite下
begin
-- Call the procedure
ad_pa_insert_package.insert_ad_pm_prod_family_map(x_product_abbreviation = 'cux',
x_product_family_abbreviation = 'os_xxx',
x_aru_update_date = TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'),
x_currdate = TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'),
x_last_updated_by = -1,
x_created_by = -1);
COMMIT;
end;
4.增加一個(gè)BUSINESS_ENTITY的lookup code(應(yīng)用開發(fā)員職責(zé)-應(yīng)用產(chǎn)品 - 代碼-Oracle Application Object),這個(gè)Lookup會(huì)用在下
一步的API中的@rep:category BUSINESS_ENTITY
這里增加的code為ORACLESEEKER
5.編寫PL/SQL API Specification
CREATE OR REPLACE PACKAGE CUX_SUPPLIER_PKG AS
/* $Header: $ */
/*#
* This package using maintain the supplier information
* @rep:scope public
* @reproduct CUX
* @rep:lifecycle active
* @rep:displayname Supplier Approve result
* @rep:compatibility S
* @rep:category BUSINESS_ENTITY ORACLESEEKER
*/
/*#
* insert approve result
* @param apply_id apply id
* @param node_id node id
* @param node_name node name
* @param approver_id approver id
* @param approver_name approver name
* @param approve_result approve result
* @param approve_opinion approve opinion
* @param approve_date approve date
* @return a varchar
* @rep:scope public
* @rep:lifecycle active
* @rep:displayname insert supplier approve result Webservice
*/
FUNCTION f_insert_approve_result(apply_id IN NUMBER,
node_id IN NUMBER,
node_name IN VARCHAR2,
approver_id IN NUMBER,
approver_name IN VARCHAR2,
approve_result IN NUMBER,
approve_opinion IN VARCHAR2,
approve_date IN DATE) RETURN VARCHAR2;
END CUX_SUPPLIER_PKG;
需要注意Package中的注釋并不是隨便填寫的,每一個(gè)注釋都會(huì)對(duì)應(yīng)到Oracle Integration Repositoy接口的說明上去,對(duì)于要注冊(cè)成
Webservice的PL/SQL API必須按照要求來填寫。
注釋標(biāo)簽具體的含義需要參考《Oracle E-Business Suite Integrated SOA Gateway Developer's Guide》
6.驗(yàn)證PLSQL接口文件,并生成ildt文件
將編寫好的PLSQL聲明定義保存為.pls文件(PAUL_ITEM_PKG.pls),并將其上傳到服務(wù)器應(yīng)用$CUX_TOP/patch/115/sql目錄下,然后執(zhí)行下
邊的命令生成ildt文件
/usr/bin/perl $FND_TOP/bin/irep_parser.pl -g -v -username=sysadmin
cuxatch/115/sql:CUX_SUPPLIER_PKG.pls:12.0=CUX_SUPPLIER_PKG.pls
7.將iLDT文件上傳到Oracle Integration Repositoy
FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/wfirep.lct CUX_SUPPLIER_PKG_pls.ildt
8.在對(duì)應(yīng)的Product Family和Product下就能看到你的接口
9.在Web服務(wù)調(diào)用的時(shí)候,需要有一個(gè)應(yīng)用數(shù)據(jù)庫用戶來連接EBS數(shù)據(jù)庫,因此需要?jiǎng)?chuàng)建一個(gè)具備一定權(quán)限的用戶,而為了簡化設(shè)置的麻煩
,Oracle提供了一個(gè)內(nèi)建的用戶 ASADMIN ,只要啟用它并重置密碼就可以了。
以sysadmin登錄Oracle EBS,切換到 User Management 職責(zé),進(jìn)入U(xiǎn)sers頁面,查找出asadmin用戶,通過修改密碼的方式激活asadmin,
并確保此用戶擁有Apps Schema Connect Role職責(zé)。
由于asadmin的密碼已經(jīng)被重置,因此中間服務(wù)器的文件配置$INST_TOP/ora/10.1.3/j2ee/oafm/config/system-jazn-data.xml 中對(duì)應(yīng)的
密碼也需要修改,由于配置中的密碼已被加密,我們無法提供加密后的密碼,使用過OC4J的同事應(yīng)該都知道,Oracle提供了一種重置這里
密碼的方便方法,就是采用明文密碼,在密碼前添加一個(gè)警號(hào)(!),然后重啟應(yīng)用服務(wù)器后自動(dòng)會(huì)重新加密。打開system-jazn-data.xml
文件后, 找到
user
nameASADMIN/name
display-nameDefault Apps SOA User/display-name
descriptionUsed by SOAProvider for DB connection/description
credentials{903}qMgAeO1AjQjwOJ6rIB41Sx049uG0xzhs/credentials
/user
只要將credentials的值更改為自己的密碼,如我的密碼設(shè)置為11111,就設(shè)置為 credentials!11111/credentials。修改完成后重啟
oamf,簡單的方法就是重啟Oracle EBS應(yīng)用服務(wù)。
附重啟命令:
cd $INST_TOP/admin/scripts
01、關(guān)閉應(yīng)用 sh adstpall.sh apps/apps
02、重啟應(yīng)用 sh adstrtal.sh apps/apps
03、關(guān)閉DB
04、重啟DB
05、啟動(dòng)并發(fā)管理器 adcmctl.sh start apps/apps
10.為集成接口創(chuàng)建授權(quán)
發(fā)布到Oracle Integration Repositoy中的Web服務(wù)能夠被訪問必須有相應(yīng)的權(quán)限才可以,這也是受到AOL安全模型限制的一個(gè)體現(xiàn)。
登錄EBS后切換到Integrated SOA Gateway職責(zé),在 Integration Repositoy 中找出已經(jīng)上傳好的客戶化集成接口,選擇接口過程和方法
后點(diǎn)擊Create Grant 按鈕
選擇授權(quán)類型:All Users、Group of Users 和 Specific USer,下面設(shè)置為最后一種方式
11.完成以上工作后,點(diǎn)擊Generate WSDL按鈕來生成集成接口對(duì)應(yīng)的Web服務(wù)WSDL信息
成功完成后可以看到如下Web服務(wù)的狀態(tài)為:Generated
點(diǎn)擊 Deploy 按鈕來發(fā)布Web服務(wù)到中間服務(wù)器中,發(fā)布后Web服務(wù)的狀態(tài)為: Deployed
-----------------------------------------------
12.如果在測(cè)試中報(bào)java.security.PrivilegedActionException: javax.xml.soap.SOAPException: Message send failed: For input
string: ""
執(zhí)行以下操作:
cd $ORA_CONFIG_HOME/10.1.3/j2ee/forms/config/oc4j.properties
注釋代理服務(wù)
#http.proxyHost=
#http.proxyPort=
重啟服務(wù)
13.如果填寫信息提交后會(huì)報(bào)出 wsse:FailedAuthentication 這樣的錯(cuò)誤信息,這是由于提交的Soap消息中并沒有包括Oracle
Integration Repository要求的AOL安全認(rèn)證,即沒有Oracle EBS系統(tǒng)要求的用戶、職責(zé)、安全組和語言信息,也就是沒有進(jìn)行Oracle
EBS的環(huán)境初始化
wsdl文件路徑/ebsr12/test/inst/apps/TEST_scmdev/soa/PLSQL/4343
此問題可以通過修改wsdl文件來解決
01刪除CUX_SUPPLIER_PKG_soap.wsdl中
element name="SOAHeader"
complexType
sequence
element name="Responsibility" minOccurs="0" type="string"/
element name="RespApplication" minOccurs="0" type="string"/
element name="SecurityGroup" minOccurs="0" type="string"/
element name="NLSLanguage" minOccurs="0" type="string"/
element name="Org_Id" minOccurs="0" type="string"/
/sequence
/complexType
/element
02刪除CUX_SUPPLIER_PKG_soap_http.wsdl中
element name="SOAHeader"
complexType
sequence
element name="Responsibility" minOccurs="0" type="string"/
element name="RespApplication" minOccurs="0" type="string"/
element name="SecurityGroup" minOccurs="0" type="string"/
element name="NLSLanguage" minOccurs="0" type="string"/
element name="Org_Id" minOccurs="0" type="string"/
/sequence
/complexType
/element
修改后點(diǎn)擊invoke,如出現(xiàn)“處理服務(wù)時(shí)出錯(cuò)”,進(jìn)行如下處理
/ebsr12/test/inst/apps/TEST_scmdev/soa/PLSQL/4343/F_INSERT_APPROVE_RESULT.wsdl
查看這個(gè)文件的內(nèi)容
jcaperation
PackageName=”O(jiān)RACLESEEKER_DEPT_PKG”
ProcedureName=”ADD_DEPARTMENT”
IRepInternalName=”PLSQL:ORACLESEEKER_DEPT_PKG:ADD_DEPARTMENT”
IRepOverloadSeq=”1〃
InteractionSpec=”oracle.tip.adapter.apps.AppsStoredProcedureInteractionSpec”
/jcaperation
ORACLE調(diào)用接口(Oracle Call Interface簡稱OCI)提供了一組可對(duì)ORACLE數(shù)據(jù)庫進(jìn)行存取的接口子例程(函數(shù)),通過在第三代程序設(shè)計(jì)語言(如C語言)中進(jìn)行調(diào)用可達(dá)到存取ORACLE數(shù)據(jù)庫的目的。
在普通的情況下,用戶可以通過SQL和PL/SQL來訪問數(shù)據(jù)庫中的數(shù)據(jù)。ORACLE數(shù)據(jù)庫除了提供SQL和PL/SQL來訪問數(shù)據(jù)庫外,還提供了一個(gè)第三代程序設(shè)計(jì)語言的接口,用戶可以通過C、COBOL、FORTRAN等第三代語言來編程訪問數(shù)據(jù)庫。OCI就是為了實(shí)現(xiàn)高級(jí)語言訪問數(shù)據(jù)庫而提供的接口。OCI允許開發(fā)者在程序里使用SQL和PL/SQL來訪問數(shù)據(jù)庫。開發(fā)者可以使用第三代語言來編寫程序,而使用OCI來訪問數(shù)據(jù)庫。
sql語句
配置acl權(quán)限(oracle11及以上訪問網(wǎng)絡(luò),賬號(hào)需要acl權(quán)限)
java調(diào)用存儲(chǔ)過程,以及接受結(jié)果