❶ c#webservice接口开发调用Oracle数据库为什么会出现这种状况
以下几个步骤一一排除问题:
建立链雹伏本地webservice引用,用这个引用试试能不能连接上oracle。肆迟如果能说明不是iis部署的问题。棚携
程序中添加oralce的引用,像using System.Data.SqlClient;或using System.Data.OracleClient;这样的引用。排除数据库引用的问题。
用本机的oracle连接oracle服务器,看能不能连接上,如果能则排除连接问题。
❷ Oracle EBS 的接口方式是什么样的与 DBLINK 有什么不同
1、标准接口表2、标准API前者例如AP的发票接口表,供应商、客户接口表,具体实现方式是,将数据按照接口表规格准备到接口表中,然后运行标准的import程序将接口表数据导入到Oracle EBS中(即各接口表对应的正式table中)。
而例如银行、分行、银行帐户相关API,一般通过客户化程序,调用此类API实现将数据导入系统,此时一般也会新建一些客户化staging table,先将外部数据准备到staging table后,再使用客户化程序,调用API将资料导入Oracle EBS中。
通常,“Oracle EBS的接口方式”指的是数据进入Oracle EBS的方式,主要有两类技术:
1、标准接口表
2、标准API
前者例如AP的发票接口表,供应商、客户接口表,具体实现方式是,将数据按照接口表规格准备到接口表中,然后运行标准的import程序将接口表数据导入到Oracle EBS中(即各接口表对应的正式table中)。
而例如银行、分行、银行帐户相关API,一般通过客户化程序,调用此类API实现将数据导入系统,此时一般也会新建一些客户化staging table,先将外部数据准备到staging table后,再使用客户化程序,调用API将资料导入Oracle EBS中。
而DBLINK则是数据库之间的资料交换方式,假如Oracle EBS的数据库需要与其他数据库(例如其他系统的数据库)进行资料交互,那么DBLINK是其中一个选项而已。
以上,两者直接比较没有太大意义,完全可能是应用于不同业务场景下的技术。
❸ 通过JDBC连接oracle数据库的几个技巧
java数据库连接(jdbc)api是一系列能够让java编程人员访问数据库的接口,各个开发商的接口并不完全相同。以下是一些技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。1、在客户端软件开发中使用thin驱动程序
在开发java软件方面,oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择oci驱动程序或thin驱动程序。oci驱动程序利用java本地化接口(jni),通过oracle客户端软件与数据库进行通讯。thin驱动程序是纯java驱动程序,它直接与数据库进行通讯。为了获得最高的性能嫌尘,oracle建议在客户端软件的开发中使用oci驱动程序,这似乎是正确的。但我建议使用thin驱动程序,因为通过多次测试发现,在通常情况下,thin驱动程序的性能都超过了oci驱动程序。
2、关闭自动提交功能,提高系统性能
在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的connection类的setautocommit()方法关闭自动提交功能,如下所示:
conn.setautocommit(false);
值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态sql或有时间限制的命令中使用statement对象
在执行sql命令时,我们有二种选举明择:可以使用preparedstatement对象,也可以使用statement对象。无论多少次地使用同一个sql命令,preparedstatement都只对它解析和编译一次。当使用statement对象时,每次执行一个sql命令时,都会对它进行解析和芹答禅编译。这可能会使你认为,使用preparedstatement对象比使用statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的sql操作中,除非成批地处理sql命令,我们应当考虑使用statement对象。
此外,使用statement对象也使得编写动态sql命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的sql命令。因此,我认为,statement对象可以使动态sql命令的创建和执行变得更加简单。
4、利用helper函数对动态sql命令进行格式化
在创建使用statement对象执行的动态sql命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字o'reilly插入表中的sql命令,则必须使用二个相连的“''”号替换o'reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个sql命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个date型的值,然后让它输出基于oracle的to_date()函数的字符串表达式。
5、利用preparedstatement对象提高数据库的总体效率
在使用preparedstatement对象执行sql命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个preparedstatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的sql命令,使用preparedstatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行preparedstatement任务需要的时间长于statement任务,我会建议在除动态sql命令之外的所有情况下使用preparedstatement对象。
6、在成批处理重复的插入或更新操作中使用preparedstatement对象
如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。oracle提供的statement和 callablestatement并不真正地支持批处理,只有preparedstatement对象才真正地支持批处理。我们可以使用addbatch()和executebatch()方法选择标准的jdbc批处理,或者通过利用preparedstatement对象的setexecutebatch()方法和标准的executeupdate()方法选择速度更快的oracle专有的方法。要使用oracle专有的批处理机制,可以以如下所示的方式调用setexecutebatch():
preparedstatement pstmt3d null;
try {
((oraclepreparedstatement)
pstmt).setexecutebatch(30);
...
pstmt.executeupdate();
}
调用setexecutebatch()时指定的值是一个上限,当达到该值时,就会自动地引发sql命令执行,标准的executeupdate()方法就会被作为批处理送到数据库中。我们可以通过调用preparedstatement类的sendbatch()方法随时传输批处理任务。
7、使用oracle locator方法插入、更新大对象(lob)
oracle的preparedstatement类不完全支持blob和clob等大对象的处理,尤其是thin驱动程序不支持利用preparedstatement对象的setobject()和setbinarystream()方法设置blob的值,也不支持利用setcharacterstream()方法设置clob的值。只有locator本身中的方法才能够从数据库中获取lob类型的值。可以使用preparedstatement对象插入或更新lob,但需要使用locator才能获取lob的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取lob的值。
8、使用sql92语法调用存储过程
在调用存储过程时,我们可以使用sql92或oracle pl/sql,由于使用oracle pl/sql并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用sql92。
9、使用object sql将对象模式转移到数据库中
既然可以将oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用jpublisher等工具生成自己的java bean类。如果使用这种方式,不但java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。
❹ 请教oracle oci 的 OCI
Oracle Call Interface (OCI):Oracle 调用接口 。
Oracle 调用接口 (OCI) 是最全面、性能最高、基于原生“C”语言的 Oracle 数据库接口,它可以提供 Oracle 数据库的全部功能。OCI 为构建各种语言专用接口(如 Oracle JDBC-OCI、ODP.Net、Oracle 预编译器、芦誉Oracle ODBC 和 Oracle C++ Call Interface (OCCI)驱动程序)提供了基础。各种领先的开源接口(如 PHP OCI8 扩展、ruby-oci8、Perl DBD::oracle 和 Python cx_oracle)也都使用 OCI。作为对 Oracle 数据库的原生接口,OCI 还对 Oracle 数据库核心内部发出的查询、语句和调用进行了增强。各种 Oracle 工具(如 SQL*Plus、Real Application Testing (RAT)、SQL*Loader 和 Data-Pump)也都是基于 OCI。此外败哗桐, Oracle In-Memory Database Cache(即 IMDB Cache,又称为 TimesTen)也支持 OCI 和 Oracle Pro*C/C++ 预编译器。Oracle Instant Client 为 ISV 和客户提供了快速安装和部署 Oracle 应用程序的能力。
OCI就是为了实现高级语言访问数据库而提供的接口。OCI允许开发者在程序里察坦使用SQL和PL/SQL来访问数据库。开发者可以使用第三代语言来编写程序,而使用OCI来访问数据库。
❺ PB内置Oracle数据库接口的使用方法[1]
PowerBuilder(PB)和Oracle分别是前端开发工具和RDBMS的主流产品 PB提供了两种与Oracle连接的接口 PowerSoft内置的数据库接口(Native Database Interface)和ODBC接口
PowerBuilder与Oracle的连接
假定已安装Oracle客户端应用程序 可用Sqlplus或Tnsping等是否能连接到Oracle数据库 确定在SQL*NET配置文件中使用的数据库别名(Database Alias 又称服务器名 Server Name) 如有疑问 可在Oracle客户端程序目录下tnsname ora文件中找到 另外保证搜索路径已包括SQL*NET应用程序的安装目录(如C:ORAWIN BIN)
进入PB的Database Profiles画笔 可看到所有已安装的数据库接口(PB 缺省安装的是Oracle 版的接口 如使用低版本的Oracle 需在安装时指定) 选择 O Oracle 点击 New 按钮 进入Database Profile Setup对话框 在 Connection 页输入下列信息 Profile Name:为该Database Profile起一个有意义的名称 Server:@TNS:ServerName 其中ServerName为上述数据库别名(服务器名) 如@TNS:ORA ;注意 PB 则没有前面那个@TNS:!!!
Login ID:Oracle数据库中实际的用户名 由于PB初次连接到数穗册据库时要自动建立五个系统表(PowerBuilder Catalog Table:PBCATTBL PBCATCOL PBCATEDT PBCATFMT PBCATVLD 存储表的扩展属性) 因此第一个连接到Oracle的用户必须具有建表 给PUBLIC角色授权等权限 例如可用SYSTEM用户进行第一次连接 此后的连接对用握族滚户则无特殊要求
Password:该用户的口令
设置上述内容后 即可连上Oracle 为优化数据库连接 还可设置下列选项
Prompt for Database Information:连接时是否提示用户输入用户名和口令
Generate Trace:启动DB跟踪工具 跟踪连接
Thread Safe:开发需要多线程环境支持的分布式应用时 选择该项 缺省为未选 适用于非分布应用
PBDBMS:与存储过程调用方式有关的参数 Oracle为 或更高版本时 清除该选项 此时带IN OUT参数的存储过程可作为数据窗口数据源 版本以下 选择该项 调用PBDBMS Put Line建立存储过程的SQL语句 缺省是选中
Commit on Disconnect:断开连接时 指定提交或回退未提交的事务
Case Sensitive:连接的Oracle服务器是否区分大小写 注意该项选中时段余 所有主键 包含主键的表名 外键须全为大写字符
PowerBuilder Catalog Tables Owner:指定拥有PB系统表的用户 缺省为 SYSTEM 如果要使用多种显示格式或有效性规则 可以在不同的用户下建立几套系统表
Table Criteria:指定满足哪些条件的表 视图和同义词可在 Select Tables 对话框中显示出来 例如DEV用户下销售子系统的表都以SALE开头 则可以用SALE% DEV TABLE VIEW 指定只显示DEV用户以SALE开头的表和视图
Asynchronous:选择该项 可在一个复杂的SQL语句执行过程中 返回第一行结果前 切换到其他操作
Number of Seconds to Wait:若上一项选中 还可进一步通过该项指定检索数据时 等待数据库响应的时间
Retrieve Blocking Factor:决定数据窗口对象一次可从数据库取出的记录数
Number of SQL Staments Cached:PB可将数据窗口对象产生的SQL语句和嵌入式SQL语句保存在SQL语句缓冲区 该参数指定缓冲区为PB保留的SQL语句数目 该数值可由下式计算 SQLCache=服务器OPEN CURSORS数 (保留的游标数) 本连接预期使用的最大游标数
Disable Bind:指定是否将输入变量与SQL语句绑定 此参数影响PB为数据窗口对象生成INSERT语句的方式
Static Bind:数据窗口对象检索数据前是否检测SELECT语句的合法性
在Syntax页 还可指定日期 时间的格式等 在Preview页可查看Database Profile设置对应的PowerScript写法
Oracle存储过程的使用
归纳起来PB 中调用Oracle存储过程有以下四种方法
方法一 以关键字RPCFUNC声明存储过程
方法二 以DECLARE PROCEDURE语句声明存储过程
方法三 以动态SQL语句实现
方法四 调用函数PBDBMS Put Line
一般情况下 方法一能得到较好的运行效率和更完善的功能 因此推荐使用方法一 但是某些类型的存储过程只能使用其他方法 以下重点介绍方法一和方法二
两种方法比较起来 有以下几点主要区别
)方法一适用于具有IN OUT和IN OUT参数的存储过程 而方法二仅支持IN和OUT参数 不支持IN OUT参数
)方法一对参数的数目无限制 方法二最多支持 个参数
)方法一不支持记录(Recorder)的传递 方法二可传递和接收记录
方法一操作步骤
)在用户对象画笔中创建一个Class Standard类型的 从Transaction继承的用户对象
)在此用户对象中 声明Local External Functions 将存储过程以RPCFUNC关键字声明为外部函数 在Declare Local External Functions对话框中按Proceres按钮选择要调用的后台存储过程 或直接输入类似subroutine TEST(long id ref string name)RPCFUNC ALIAS FOR DEVTEST 的语句 例如DEVTEST的参数为(id IN NUMBER name IN OUT VARCHAR )
)保存该用户对象
)在Application画笔中 进入应用属性对话框 在Variable Types页 将上Transaction用户对象设置为缺省的全局变量SQLCA
)脚本中 编码调用相应的外部函数 形式 SQLCA函数名(参数) 如可用 SQLCATEST(ln id ls name) 调用例子中定义的DEVTEST存储过程 其中ln id ls name为调用参数
方法一注意事项
)由于PB中String类型的数据长度是动态分配的 因此对Ref String类型的参数 每次调用前需要申请足够的空间 例如上例从输入的id值检索name 后台声明的NAME数据类型为VARCHAR ( ) 每次调用SQLCATEST前需要用ls name=SPACE( )置ls name为足够长度的空串
lishixin/Article/program/PB/201311/24641
❻ 有人用过oracle的oci么
oracle调用接口(oracle Call Interface简称oci)提供了一组可对oracle数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取oracle数据库的目的。
在普通的情况下,用户可以通过sql和PL/sql来访问数据库中的数据。oracle数据库除了提供sql和PL/sql来访问数据库外,还提供了一个第三代程序设计语言的接口,用户可以搏猜通过C、cobol、fortran等第三代语言来编程访问数据库。oci就是为了实现高级语言访问数据库而提供的接口。oci允许开发者在程序里使用sql和PL/sql来访问数据库。开发者可以使用第三伏银老代语言缺升来编写程序,而使用oci来访问数据库。
oci是由一组应用程序开发接口(api)组成的,ORACLE提供api的方式是提供一组库。这组库包含一系列的函数调用。这组函数包含了连接数据库、调用SQL和事务控制等。在安装dbms server或者客户端的时候,就安装了OCI。
OCI开发方法实际上是将结构化查询语言(SQL)和第三代程序设计语言相结合的一种方法。对数据库的访问是通过调用OCI库函数实现的,若将C语言作为宿主语言,那么ORACLE数据库调用其实就是C程序中的函数调用,一个含OCI调用的C程序其实就是用C语言编写的应用程序。这样的程序既具有SQL语言非过程性的优点又具有C语言过程性的优点,同时还可具有SQL语言的扩展,PL/SQL语言过程性和结构性的优点,因此使得开发出的应用程序具有高度灵活。
❼ sqlplus如何连接oracle数据库
方法一:
1、在开始菜单中,找到oracle应用程序开发-SQL PLUS。双击SQL PLUS。
❽ otl格式文档怎么下载
在使用C++连接数据库的时候,你可以选择ODBC或者ADO等方岁枣手式,但是OTL连接数据库确实挺方便的,它所有的代码都放在一个头文件otlv4.h中,我们在写程序的时候直接将头文件包含进来,就可以调用其中的类中的函数进行数据库的连接,增删改查等操作。最近一直在使用Oracle数据库,这次就使用OTL连接Oracle数据库,Oracle数据库提供一个调用的接口(OCI),是Oracle公司开发的一个应用程序开发工具,是一个通过访问Oracle数据库的服务器,控制各类sql语句的执行,进而创建应用程序接口(API),OTL就是通过OCI对Oracle数据库进行操作。
下面就是我写过的一个实际例子,比较简单,只是为了登录数据库,并不进行其他操作,主要目的是学会使用OTL:
1. 所需文件:
首先我们应该从网上下载OTL的源码也就是 otlv4.h 这个头文件。
然后打开Oracle的安装目录E:\proct\11.2.0\dbhome_1\OCI 找到oci文件夹将整个文件夹拷贝出来,文件夹中包含include文件夹和lib文件夹。
2.示例:
打开VS2008创建一个MFC工程,名称为mfc_one. (其它的就不多说了,这乎嫌个都很清楚),然后打开工程目录,将OCI这个文件夹直接拷贝到工程目录下,在工程目录下新建一个文件夹OTL,将otlv4.h这个头文件放进这个文件夹中。
接下来就是配置项目属性,将文件包含进来,在mfc_oneDlg.h和岩局mfc_oneDlg.cpp中都需要将otlv4.h这个头文件包含进去 (#include"otlv4.h"
❾ Oracle数据库 关于连接池一
到目前为目 JDBC 的连结池只是一个接口 没有真正的实现 JDBC 正在开发中 据报已经支持连结池配誉乱 但JDBC 用了JNDI技术 连结池的配置可以让一个高手都烦死 目前第三方已经实现的连结池当然是poolman 版对一般用户来说已经足够用了 配置也简单虚瞎 版虽然增加了一些功能 但配置也是采用JNDI 对RMI和EJB不懂的朋友可能很烦 建议用 的了 如果有兴趣 自己也可以实现连结池 最关键的技术也就是把连结作为参数传给一个BEAN 用完后返回这个参数连结而不是关闭 下面是一个简单的实现:DBConnectionManager java程序清单如下 import java io *; import java sql *; import java util *; import java util Date; /** * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接 * 池的访问 客户程序可以调用getInstance()方法访问本类的唯一实例 */ public class DBConnectionManager { static private DBConnectionManager instance; // 唯一实例 static private int clients; private Vector drivers = new Vector(); private PrintWriter log; private Hashtable pools = new Hashtable(); /** * 返回唯一实例 如果是第一次调用此方法 则创建实例 * * @return DBConnectionManager 唯一实例 */ static synchronized public DBConnectionManager getInstance() { if (instance == null) { instance = new DBConnectionManager(); } clients++; return instance; } /** * 建构函数私有以防止其它对象创建本类实例 */ private DBConnectionManager() { init(); } /** * 将连接对象返回给由名字指定的连接池 * * @param name 在属性文件中定义的连接池名字 * @param con 连接对象\r */ public void freeConnection(String name Connection con) { DBConnectionPool pool = (DBConnectionPool) pools get(name); if (pool != null) { pool freeConnection(con); } } /** * 获得一个可用的(空闲的)连接 如果没有可用连接 且已有连接数小于最大连接数 * 限制 则创建并返回新连接 * * @param name 在属性文件中定义的连接池名字 * @return Connection 可用连接或null */ public Connection getConnection(String name) { DBConnectionPool pool = (DBConnectionPool) pools get(name); if (pool != null) { return pool getConnection(); } return null; } /** * 获得一个可用连接 若没有可用连接 且已培档有连接数小于最大连接数限制 * 则创建并返回新连接 否则 在指定的时间内等待其它线程释放连接 * * @param name 连接池名字 * @param time 以毫秒计的等待时间\r * @return Connection 可用连接或null */ public Connection getConnection(String name long time) { DBConnectionPool pool = (DBConnectionPool) pools get(name); if (pool != null) { return pool getConnection(time); } return null; } /** * 关闭所有连接 撤销驱动程序的注册\r */ public synchronized void release() { // 等待直到最后一个客户程序调用 if ( clients != ) { return; } Enumeration allPools = pools elements(); while (allPools hasMoreElements()) { DBConnectionPool pool = (DBConnectionPool) allPools nextElement(); pool release(); } Enumeration allDrivers = drivers elements(); while (allDrivers hasMoreElements()) { Driver driver = (Driver) allDrivers nextElement(); try { DriverManager deregisterDriver(driver); log( 撤销JDBC驱动程序 + driver getClass() getName()+ 的注册\ ); } catch (SQLException e) { log(e 无法撤销下列JDBC驱动程序的注册: + driver getClass() getName()); } } } /** * 根据指定属性创建连接池实例 * * @param props 连接池属性 */ private void createPools(Properties props) { Enumeration propNames = props propertyNames(); while (propNames hasMoreElements()) { String name = (String) propNames nextElement(); if (name endsWith( url )) { String poolName = name substring( name lastIndexOf( )); String url = props getProperty(poolName + url ); if (url == null) { log( 没有为连接池 + poolName + 指定URL ); continue; } String user = props getProperty(poolName + user ); String password = props getProperty(poolName + password ); String maxconn = props getProperty(poolName + maxconn ); int max; try { max = Integer valueOf(maxconn) intValue(); } catch (NumberFormatException e) { log( 错误的最大连接数限制: + maxconn + 连接池: + poolName); max = ; } DBConnectionPool pool = new DBConnectionPool(poolName url user password max); pools put(poolName pool); log( 成功创建连接池 + poolName); } } } /** * 读取属性完成初始化 */ private void init() { InputStream is = getClass() getResourceAsStream( /db properties ); Properties dbProps = new Properties(); try { dbProps load(is); } catch (Exception e) { System err println( 不能读取属性文件 + 请确保db properties在CLASSPATH指定的路径中 ); return; } String logFile = dbProps getProperty( logfile DBConnectionManager log ); try { log = new PrintWriter(new FileWriter(logFile true) true); } catch (IOException e) { System err println( 无法打开日志文件: + logFile); log = new PrintWriter(System err); } loadDrivers(dbProps); createPools(dbProps); } /** * 装载和注册所有JDBC驱动程序\r * * @param props 属性 */ private void loadDrivers(Properties props) { String driverClasses = props getProperty( drivers ); StringTokenizer st = new StringTokenizer(driverClasses); while (st hasMoreElements()) { String driverClassName = st nextToken() trim(); try { Driver driver = (Driver) Class forName(driverClassName) newInstance(); DriverManager registerDriver(driver); drivers addElement(driver); log( 成功注册JDBC驱动程序\ + driverClassName); } catch (Exception e) { log( 无法注册JDBC驱动程序: + driverClassName + 错误: + e); } } } /** * 将文本信息写入日志文件 */ private void log(String msg) { log println(new Date() + : + msg); } /** * 将文本信息与异常写入日志文件 */ private void log(Throwable e String msg) { log println(new Date() + : + msg); e printStackTrace(log); } /** * 此内部类定义了一个连接池 它能够根据要求创建新连接 直到预定的最\r lishixin/Article/program/Oracle/201311/17331
❿ c程序通过什么连接oracle
一般C语言连接oracle数据库通过使用oracle提供的OCI接口和PROC编程接口两种方式。
OCI方式纯粹是一些函数接口。
PROC是oracle提供的一种C与ORACLE
SQL的混合编程。程序(以.pc为后缀)编好之后,使用oracle提供的proc预编译程序,将pc文件编译成c文件(这一过程,相当于将SQL转换为OCI的接口),然后再使用c语言编译器生成可以执行文件。
OCI方式不容易入门,它拥有大量的接口函数,要很快熟悉它,非常难。但OCI方式的编程效率很高。
porc方式简单易用。可用于对性能要求不太高的项目。