可以在vc下调用存储过程来实现
例子:
先修改init.ora
例如:
utl_file_dir=/usr //路径为 oracle所在的盘:/usr
此过程将用户TEMP的P1过程的代码保存到ORACLE安装盘下/USR/TEXT.TXT中
create or replace procedure TEST
is
file_handle utl_file.file_type;
STOR_TEXT VARCHAR2(4000);
N NUMBER;
I NUMBER;
begin
I:=1;
SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';
file_handle:=utl_file.fopen('/usr','test.txt','a');
WHILE I<=N LOOP
SELECT TEXT INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;
I:=I+1;
utl_file.put_line(file_handle,stor_text);
END LOOP;
utl_file.fclose(file_handle);
commit;
end TEST;
/根据自己的实际情况改一下吧
例子:
先修改init.ora
例如:
utl_file_dir=/usr //路径为 oracle所在的盘:/usr
此过程将用户TEMP的P1过程的代码保存到ORACLE安装盘下/USR/TEXT.TXT中
create or replace procedure TEST
is
file_handle utl_file.file_type;
STOR_TEXT VARCHAR2(4000);
N NUMBER;
I NUMBER;
begin
I:=1;
SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';
file_handle:=utl_file.fopen('/usr','test.txt','a');
WHILE I<=N LOOP
SELECT TEXT INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;
I:=I+1;
utl_file.put_line(file_handle,stor_text);
END LOOP;
utl_file.fclose(file_handle);
commit;
end TEST;
/根据自己的实际情况改一下吧
操作文件用utl_file包
1.1 PRO*C原理
PRO 系列是ORACLE 公司提供的在第三代高级程序设计语言中嵌入SQL 语句来访问数据库的一套预编译程序,包括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六种。程序员用相应的高级语言编写嵌入SQL 语句的PRO 源程序(若用C 语言则称为PRO*C 源程序)后运行相应的预编译程序,把嵌入的SQL 语句转换为标准的ORACLE 调用并生成目标源程序,即纯高级语言格式的源程序,然后就可以将这些源程序加入用户的程序中调用。 ORACLE 预编译程序提供如下功能:
⑴能用六种通用的高级程序设计语言中的任何一种编写应用程序。
⑵遵循ANSI 标准,在高级语言中嵌入SQL 语句。
⑶可采用动态SQL 方法,让程序在运行时接受或构造一个有效的SQL 语句。
⑷实现ORACLE 内部数据类型和高级语言数据类型之间的自动转换。
⑸可通过在应用程序中嵌入PL/SQL 事物处理块来改进性能。
⑹能在程序行和命令行上指定所需要的预编译可选项,并可在预编译的过程中改变它们的值。
⑺能全面检查嵌入的SQL 数据操纵语句和PL/SQL 块的文法和语义。
⑻可用SQL*Net 并行存取多个地点的ORACLE 数据库。
⑼可把数组作为输入和输出程序变量使用。
⑽能对应用程序中的代码段进行条件预编译。
⑾提供了较强的异常处理功能。
由此可见,通过预编译程序与其它高级语言的结合,既可以利用SQL 强有力的功能和灵活性为数据库应用系统的开发提供强有力的手段,又可以充分利用高级语言自身在系统开发方面的优势,从而提供一个完备的基于ORACLE 数据库应用程序的开发解决方案。 1.2 在VC 中使用PRO*C 每个PRO*C 源文件一般由程序头和程序体两部分组成。程序头包含宿主变量(SQL 语句中所包含的变量)说明、通讯区定义和C 外部表示符的说明等。程序体一般是由若干函数组成,这些函数内含有SQL 语句(以EXEC SQL 起头的语句)。 PRO*C 支持的数据类型包括VARCHAR2( 变长字符串)、NUMBER( 二进制数)、INTGER( 有符号整数)、FLOAT( 浮点数)、STRING( 以NULL 结尾的字符串)、VARNUM( 变长二进制数)、LONG( 变长字符串)、VARCHAR( 变长字符串)、ROWID( 二进制值)、DATE( 定长日期/ 时间值)、VARRAW( 变长二进制数据)、RAW( 定长二进制数据) 、LONGRAW( 变长二进制数据)、UNSIGNED( 无符号整数)、LONGVARCHAR( 变长字符串)、LONGVARRAW( 变长二进制数据)、CHAR( 定长字符串)、CHARZ(C 中定长以NULL 结尾的字符串)、MLSLABEL( 变长二进制数据)。 在PRO*C 中不能使用'l' 或'u' 作词尾或'0x' 作词头修饰常量;在SQL 语句中使用单引号来定义字符串,用双引号来定义特殊的或小写字符的标识符( 如表名等);SQL 语句中不允许使用C 中的寻址、间接、位逻辑、复合赋值、?=、-、++、%、<<、>> 操作符并且用NOT、AND、OR、= 代替!、&&、||、==。 下面的程序是一个联结数据库的PRO*C 源程序例子。
#include < sqlca.h > //声明SQL通讯区
#include < string.h >
#include < afxwin.h >
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[20]; //声明宿主变量
VARCHAR password[20];
VARCHAR dbname[20];
EXEC SQL END DECLARE SECTION;
void db_connect()
{
strcpy((char *)username.arr,"SCOTT");
username.len = strlen((char *)username.arr);
strcpy((char *)password.arr,"TIGER");
password.len = strlen((char *)password.arr);
strcpy((char *)dbname.arr,"SUNDB");
dbname.len = strlen((char *)dbname.arr);
EXEC SQL WHENEVER SQLERROR STOP; //隐式异常处理
EXEC SQL CONNECT :username
IDENTIFIED BY :password USING :dbname;
/*if (sqlca.sqlcode != 0) //显式异常处理
{
AfxMessageBox("\n与Oracle数据库连接失败!");
return;
}*/
}
在VC 中使用PRO*C 时,先用PRO*C 编写所需的操作数据库的子程序,再运行PRO*C 预编译程序把PRO*C 源程序转成相应的CPP 源程序,将该程序插入到用户工程文件中并在需要对插入函数进行调用的模块中说明函数,然后就可以在此模块中调用所需的函数。 2. 使用ODBC 中间件访问数据库 2.1 ODBC 工作原理 ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件。它通过使用相应应用平台上和所需数据库对应的驱动程序与应用程序的交互来实现对数据库的操作,避免了在应用程序中直接调用与数据库相关的操作,从而提供了数据库的独立性。 ODBC 主要由驱动程序和驱动程序管理器组成。驱动程序是一个用以支持ODBC 函数调用的模块(在WIN95 下通常是一个DLL),每个驱动程序对应于相应的数据库,当应用程序从基于一个数据库系统移植到另一个时,只需更改应用程序中由ODBC 管理程序设定的与相应数据库系统对应的别名即可。驱动程序管理器(包含在ODBC32.DLL 中)可链接到所有ODBC 应用程序中,它负责管理应用程序中ODBC 函数与DLL 中函数的绑定。 ODBC 使用层次的方法来管理数据库,在数据库通信结构的每一层,对可能出现依赖数据库产品自身特性的地方,ODBC 都引入一个公共接口以解决潜在的不一致性,从而很好地解决了基于数据库系统应用程序的相对独立性,这也是ODBC 一经推出就获得巨大成功的重要原因之一。 从结构上分,ODBC 分为单束式和多束式两类。 ⑴单束式驱动程序 单束式驱动程序介于应用程序和数据库之间,像中介驱动程序一样数据提供一个统一的数据访问方式。 当用户进行数据库操作时,应用程序传递一个ODBC 函数调用给ODBC 驱动程序管理器,由ODBC API 判断该调用是由它直接处理并将结果返回还是送交驱动程序执行并将结果返回。 由上可见,单束式驱动程序本身是一个数据库引擎,由它直接可完成对数据库的操作,尽管该数据库可能位于网络的任何地方。 ⑵多束式驱动程序 多束式驱动程序负责在数据库引擎和客户应用程序之间传送命令和数据,它本身并不执行数据处理操作而用于远程操作的网络通信协议的一个界面。 前端应用程序提出对数据库处理的请求,该请求转给ODBC 驱动程序管理器,驱动程序管理器依据请求的情况,就地完成或传给多束驱动程序,多束式驱动程序将请求翻译为特定厂家的数据库通信接口(如Oracle 的SQLNet)所能理解的形式并交于接口去处理,接口把请求经网络传送给服务器上的数据引擎,服务器处理完后把结果发回给数据库通信接口,数据库接口将结果传给多束式ODBC 驱动程序,再由驱动程序将结果传给应用程序。 2.2 在VC 中使用ODBC Visual C++ 中提供了CDatabase、CRecordset、CRecordView、CDBException 和CFieldExchange 五个类,这些类封装了ODBC SDK 函数,从而使用户可以无需了解SDK 函数就可以很方便地操作支持ODBC 的数据库。 CDatabase 类:封装了与数据库建立连接,控制事务的提交和回滚及执行SQL 语句的方法。 CRecordset 类:封装了大部分操纵数据库的方法,包括浏览、修改记录,控制游标移动,排序等操作。 CRecordView 类:提供了与recordset 对象相连接的视,可以建立视中的控件与数据库数据的对应,同时支持移动游标,修改记录等操作。 CDBException 类:提供了对数据库操作的异常处理,可以获得操作异常的相关返回代码。 CFieldExchange 类:提供了用户变量与数据库字段之间的数据交换,如果不需要使用自定义类型,你将不用直接调用该类的函数,MFC Wizard 将自动为程序员建立连接。 使用最频繁是的CRecordset 以及 CrecordView.
3. 两种方法的比较 综上所述,使用这两种方法在Visual C++ 中都可以很方便地开发出基于ORACLE 数据库的应用程序,同时,这两种方法又各有其优缺点。ODBC 由于有MFC 强大的类库支持而使得编程实现非常方便,同时可移植性也很强,在异构的数据库之间移植也只需更改很少的一部分程序,但是,由ODBC 的实现机制我们可以看到,与PRO*C 相比,应用程序需要经过ODBC 驱动程序管理器和ODBC 驱动程序两层才能和数据库通信接口建立联系,而PRO*C 是直接与通信接口联系,因此建立在ODBC 上应用程序的执行效率会相对低一些。PRO*C 具有执行效率高,支持嵌入式PL/SQL 块等ORACLE 自身特有的优点,但正因为有了这些优点,使得用PRO*C 开发出的应用程序无法向异构数据库平台移植。
有哪位可以帮忙提供一下 关于这方面的代码的程序或网站吗?
我邮箱是 [email protected]
ADO 使用OLE DB接口访问范围广大的数据源,包括但不限于通过ODBC提供
的数据。 在这里我们不得不提到另一个对象 RDS。 Microsoft Remote Data
Service(RDS)是ADO的一个组件,它为驻留在 Microsoft Internet Ex-
plorer上的应用程序提供快速有效的数据连接和数据发布框架。它是一种
基于工作在 HTTP、HTTPS(在Secure Sockets层上的HTTP)和DCOM应用程
序协议之上的客户端/服务器的分布式技术。RDS 使用数据识别ActiveX控
件,向需要建立分布式、数据密集且用于企业内部网和Internet的应用程
序的Web开发人员提供以Microsoft Visual Basic样式编程的数据访问。 下面我们就在Visual C++6.0中利用ADO实现一个数据库编程的实际
例子,以便让大家对ADO有一个认识。 1.首先建立应用程序的框架并初始化运行环境(前面提到过ADO是用
于访问数据的基于OLE DB 接口访问的数据源,所以要初始化OLE/COM库环
境) 利用 Visual C++的 MFC AppWizard(exe)创建一个标准的单文档
(Single Document)应用程序(比如采用默认设置)。 2.引入ADO的库文件msado15.dll 我们在使用ADO之前必须在工程中引入ADO的库文件 msado15.dll。通
常我们在文件“stdAfx.h”中将其导入;以便使编译器能正确的编译同时
生成我们需要的.tli和.tlh文件。 需要导入的代码如下: #include #import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_
namespace rename("EOF","EndofFile") 3. 利用智能指针(Smart Pointer)进行数据库操作 在CaboutDlg类的定义中定义两个ADO的智能指针类实例(后面我们会
比较详细地介绍ADO中的智能指针),同时添加一个Listbox用以显示我们
从数据库中获得字段值。 class CaboutDlg : public Cdialog
{
public:
CaboutDlg(); //添加的代码
_ConnectionPtr pConn;
_RecordsetPtr pRst;
ClistBox m_ListBox;
……
} 在ADO中的类库中包含有这样的三个智能指针,它们分别是:
-ConnectionPtr, -RecordsetPtr,-CommandPtr。下面我们就针对这
三个智能指针分别进行介绍: -ConnectionPtr, 用来管理连接一个数据源提供者所要求的信息,
并可通过Open和Close的方法来打开一个到数据源提供者的活连接(即Live
Connection)。另外还可以建立和管理事务,如BeginTrans,CommitTrans
和RollBackTrans。最后可以通过Excute这种方法在数据源上执行命令; -RecordsetPtr,封装数据源提供者返回的记录集合。使用该类可以
浏览返回的记录,也可以插入一个新的记录,或者更新和删除一个已经有
的记录; -CommandPtr,封装了一个要发送到数据库的命令串(比如通常用的
SQL查询语句)。该命令可以是一个表的名字,或者一个存储过程,或者一
个依赖数据源的串。 4. 添加执行代码 利用ClassWizard在CaboutDlg类中映射ON_WM_INITDIALOG消息添加一
个对话框的初始化函数OnInitDialog();在该函数中添加以下的代码: BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//添加的代码
_variant_t theValue;
m_ListCtrl=(CListBox *)GetDlgItem(IDC_LIST_BOX);
ASSERT(m_ListCtrl!=NULL);
m_ListCtrl->ResetContent();
pConn.CreateInstance(_uuidof(Connection));
pRst.CreateInstance(_uuidof(Recordset));
try
{
pConn→ConnectionString="DSN=Accounts";
//设置连接字符串,利用ODBC连接Accounts
数据库
pConn→Open("","sa","",NULL); //打开连接
pRst→Open("select * from Checking-Account",(IDispatch*)pConn,adOpenDynamic,adLockOptimistic,adCmdText);//执行一个SQL获得希望得到的
数据集
while (!pRst→EndofFile)
{
theValue=pRst→GetCollect("Owner_ID");
if (theValue.vt!=VT_NULL)
m_ListCtrl→AddString((char *)_bstr_t(theValue));
pRst→MoveNext();
}//遍历记录集,获得字段Owner-ID的字段值,同时将其添加到ListBox中去
pRst→Close();//关闭记录集pRst
pConn→Close(); //关闭连接pConn
}
catch(_com_error * e) //在这里对异常情况进行处理
{
CString Error=e→ErrorMessage();
AfxMessageBox(e→ErrorMessage());
}
pRst=NULL;
pConn=NULL;
return TRUE;
} 在上述的代码中我们使用了这样一种数据类型:_variant_t,它封装
了Visual C++中的VARIANT类型(在Visual Basic 中我们可能已经接触
的比较多了);还有一种数据类型就是 _bstr_t(宽字符型);有关这两
种数据类型的详细介绍请参见MSDN。
用ADO可访问本地和远方的数据库,并且只要有ODBC驱动驱动程序就可以了。
上面有位兄弟,介绍了PRO*C,我一般在UNIX系统中用PRO*C,在UNXI系统中必须启动ORACLE数据库,PRO*C才能访问本地或远端的数据库。请问能在PC机上用PRO*C访问远端的数据库吗?在PC上要在什么配置,才能访问远方DB?你自己用过吗?
{
USES_CONVERSION;
CoInitialize(NULL);
_ConnectionPtr con(__uuidof(Connection));
_RecordsetPtr rst(__uuidof(Recordset));
Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=sfinfo;Data Source=ORASYS_IBM
rst=con->Execute(_bstr_t("select * from tablename"),NULL,-1);
int v;
CString str;
while(!rst->adoEOF)
{
v = rst->GetCollect(_variant_t("report_id")).intVal;
str.Format("%d",v);
m_List.AddString(str);
rst->MoveNext();
}
con->Close();
::CoUninitialize();
}其中的Data Source=ORASYS_IBM换成你机器的本地网络服务名。
喂,老兄,你有代码,就贡献一下吧,帮帮人家!