oracle怎么调用接口,oracle接口怎么做

如何在Oracle/2000中调用Windows API函数

 1.初始化外部函数

创新互联拥有一支富有激情的企业网站制作团队,在互联网网站建设行业深耕十多年,专业且经验丰富。十多年网站优化营销经验,我们已为上1000+中小企业提供了成都做网站、网站建设解决方案,定制网站制作,设计满意,售后服务无忧。所有客户皆提供一年免费网站维护!

就是说明包含外部函数的动态链接库的位置,并从中分离出外部函数的原型,并将外部函数中主语言的数据类型和PL/SQL数据类型做一一对应的匹配。这是在包体(PackageBody)中进行的。具体分以下几步:

(1)用OQA_FFI.LOAD_LIBRARY得到包含外部函数的动态链接库的库柄,此时需提供动态链接库的名字和位置。

(2)用ORA_FFI.REGISTER_FUNCTION得到外部函数的函数柄,这时需提供动态链接库的库柄和外部函数名。

(3)用ORA_FFI.REGISTER_PARAMETER来注册外部函数的参数类型,对每一个参数都要提供它的外部函数柄和相应的PL/SQL数据类型。参数注册的顺序必须与它们出现在外部函数原型中的顺序一致。

(4)用ORA_FFI.REGISTER_RETURN来注册外部函数的返回值类型,这时需要提供它的外部函数柄和相应的PL/SQL数据类型。

2.将外部函数和一个PL/SQL子程序相关联

一个和外部函数建立关联的PL/SQL子程序,实际上指明了外部函数的内存地址,每次调用这个子程序,实际上是调用与它相对应的外部函数。具体步骤为:

(1)用ORA_FFI.FIND_FUNCTION或ORA_FFI.REGISTER_FUNCTION得到一个函数柄。

(2)在PL/SQL包体的声明部分,定义一个PL/SQL子程序,它的第一个参数是类型为ORA_FFI.FUNCHANDLETYPE,接下来是依次对应外部函数参数的PL/SQL数据类型的参数。

(3)在这个PL/SQL子程序中加入一个PRAGMA接口。PRAGMA声明就是通过将控制转到一个内存地址,来激活这个外部函数。

3.生成一个模仿外部函数的原型的PL/SQL子程序。

这个子程序就是用户可见的外部函数的PL/SQL接口,用户按照它的参数类型和返回值类型来使用外部函数,具体步骤为:

(1)在包体的声明部分,定义一个PL/SQL子程序,它的参数和返回值是和外部函数对应的PL/SQL类型。这就是模仿外部函数原型的一个子程序。

(2)在这个子程序中调用与上步生成的与外部函数相关联的PL/SQL子程序。

(3)在PL/SQL包的说明(PackageSpefication)部分,输入这个PL/SQL子程序的原型。

下面是一个完整的为WindowsAPI函数winexec建立PL/SQL接口的例子:

PACKAGEWinExecIS

FUNCTIONWinExec(ExecfileINVARCHAR2,

commandINPLS_INTEGER)

RETURNPLS_INTEGER;

END;/*在包说明部分,是模仿外部

函数原型的PL/SQL函数原型说明*/

PACKAGEBODYWinExecIS

lh_USERora_ffi.libHandleType;/*定义库柄类型变量*/

fh_WinExecora_ffi.funcHandleType;/*定义函数柄类型变量*/

FUNCTIONi_WinExec(funcHandleINora_ffi.funcHandleType,

ExecfileINOUTVARCHAR2,

commandINPLS_INTEGER)

RETURNPLS_INTEGER;

PRAGMAINTERFACE(C,i_WinExec,11265);

/*步骤2将一个PL/SQL子程序与外部函数相关联*/

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模仿函数的定义,

它实际上就是调用步骤2中与外部函数建立关联的那个函数*/

BEGIN

BEGIN

lh_USER:=ora_ffi.find_library('Kernel32.dll');

EXCEPTIONWHENora_ffi.FFI_ERRORTHEN

lh_USER:=ora_ffi.load_library(NULL,'kernel32.dll');

END;/*得到动态链接库的库柄*/

fh_WinExec:=ora_ffi.register_function

(lh_USER,'WinExec',ora_ffi.PASCAL_STD);

/*得到外部函数的函数柄*/

ora_ffi.register_parameter(fh_WinExec,

ORA_FFI.C_CHAR_PTR);/*参数注册,原类型为LPCSTR*/

ora_ffi.register_parameter(fh_WinExec,

ORA_FFI.C_INT);/*参数注册,原类型为UINT*/

ora_ffi.register_return(fh_WinExec,

ORA_FFI.C_INT);/*返回值注册,原类型为BOOL*/

ENDWinExec;

可以将多个外部函数的PL/SQL接口放在一个包内。要在Developer/2000的FormDesigner中使用这些外部函数,只要把包含这一程序包的程序库(.PLL)附加进来,使用包名.函数名就可激活这个外部函数。

例如:WinExec.WinExec('c:\windows\notepad.exe',0)

具体WindowsAPI函数数据类型和PL/SQL数据类型的转换可参照Developer/2000中ProcedureBuilder帮助文件中对ORA_FFI软件包的详细介绍。

oracle ebs api怎么用

1.创建Product Family

Product Family用于管理几个功能相近的Product(也可以立即为模块),统一管理客户化的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.注册Product,即注册Xxx University(cux)应用到产品家族中

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.关联Xxx University应用到产品家族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.增加一个BUSINESS_ENTITY的lookup code(应用开发员职责-应用产品 - 代码-Oracle Application Object),这个Lookup会用在下

一步的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中的注释并不是随便填写的,每一个注释都会对应到Oracle Integration Repositoy接口的说明上去,对于要注册成

Webservice的PL/SQL API必须按照要求来填写。

注释标签具体的含义需要参考《Oracle E-Business Suite Integrated SOA Gateway Developer's Guide》

6.验证PLSQL接口文件,并生成ildt文件

将编写好的PLSQL声明定义保存为.pls文件(PAUL_ITEM_PKG.pls),并将其上传到服务器应用$CUX_TOP/patch/115/sql目录下,然后执行下

边的命令生成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.在对应的Product Family和Product下就能看到你的接口

9.在Web服务调用的时候,需要有一个应用数据库用户来连接EBS数据库,因此需要创建一个具备一定权限的用户,而为了简化设置的麻烦

,Oracle提供了一个内建的用户 ASADMIN ,只要启用它并重置密码就可以了。

以sysadmin登录Oracle EBS,切换到 User Management 职责,进入Users页面,查找出asadmin用户,通过修改密码的方式激活asadmin,

并确保此用户拥有Apps Schema Connect Role职责。

由于asadmin的密码已经被重置,因此中间服务器的文件配置$INST_TOP/ora/10.1.3/j2ee/oafm/config/system-jazn-data.xml 中对应的

密码也需要修改,由于配置中的密码已被加密,我们无法提供加密后的密码,使用过OC4J的同事应该都知道,Oracle提供了一种重置这里

密码的方便方法,就是采用明文密码,在密码前添加一个警号(!),然后重启应用服务器后自动会重新加密。打开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的值更改为自己的密码,如我的密码设置为11111,就设置为 credentials!11111/credentials。修改完成后重启

oamf,简单的方法就是重启Oracle EBS应用服务。

附重启命令:

cd $INST_TOP/admin/scripts

01、关闭应用 sh adstpall.sh apps/apps

02、重启应用 sh adstrtal.sh apps/apps

03、关闭DB

04、重启DB

05、启动并发管理器 adcmctl.sh start apps/apps

10.为集成接口创建授权

发布到Oracle Integration Repositoy中的Web服务能够被访问必须有相应的权限才可以,这也是受到AOL安全模型限制的一个体现。

登录EBS后切换到Integrated SOA Gateway职责,在 Integration Repositoy 中找出已经上传好的客户化集成接口,选择接口过程和方法

后点击Create Grant 按钮

选择授权类型:All Users、Group of Users 和 Specific USer,下面设置为最后一种方式

11.完成以上工作后,点击Generate WSDL按钮来生成集成接口对应的Web服务WSDL信息

成功完成后可以看到如下Web服务的状态为:Generated

点击 Deploy 按钮来发布Web服务到中间服务器中,发布后Web服务的状态为: Deployed

-----------------------------------------------

12.如果在测试中报java.security.PrivilegedActionException: javax.xml.soap.SOAPException: Message send failed: For input

string: ""

执行以下操作:

cd $ORA_CONFIG_HOME/10.1.3/j2ee/forms/config/oc4j.properties

注释代理服务

#http.proxyHost=

#http.proxyPort=

重启服务

13.如果填写信息提交后会报出 wsse:FailedAuthentication 这样的错误信息,这是由于提交的Soap消息中并没有包括Oracle

Integration Repository要求的AOL安全认证,即没有Oracle EBS系统要求的用户、职责、安全组和语言信息,也就是没有进行Oracle

EBS的环境初始化

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

修改后点击invoke,如出现“处理服务时出错”,进行如下处理

/ebsr12/test/inst/apps/TEST_scmdev/soa/PLSQL/4343/F_INSERT_APPROVE_RESULT.wsdl

查看这个文件的内容

jcaperation

PackageName=”ORACLESEEKER_DEPT_PKG”

ProcedureName=”ADD_DEPARTMENT”

IRepInternalName=”PLSQL:ORACLESEEKER_DEPT_PKG:ADD_DEPARTMENT”

IRepOverloadSeq=”1〃

InteractionSpec=”oracle.tip.adapter.apps.AppsStoredProcedureInteractionSpec”

/jcaperation

oci 连接 oracle

ORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取ORACLE数据库的目的。

在普通的情况下,用户可以通过SQL和PL/SQL来访问数据库中的数据。ORACLE数据库除了提供SQL和PL/SQL来访问数据库外,还提供了一个第三代程序设计语言的接口,用户可以通过C、COBOL、FORTRAN等第三代语言来编程访问数据库。OCI就是为了实现高级语言访问数据库而提供的接口。OCI允许开发者在程序里使用SQL和PL/SQL来访问数据库。开发者可以使用第三代语言来编写程序,而使用OCI来访问数据库。

oracle通过存储过程调用web接口

sql语句

配置acl权限(oracle11及以上访问网络,账号需要acl权限)

java调用存储过程,以及接受结果


当前文章:oracle怎么调用接口,oracle接口怎么做
本文路径:http://ybzwz.com/article/dssdgjh.html