当前位置:首页 » 存储配置 » oracle存储过程的创建

oracle存储过程的创建

发布时间: 2022-06-19 23:41:11

㈠ Oracle怎么创建存储过程

首先,我想跟你说一下使用存储过程的目的。存储过程,通俗点说,你可以理解为用“储存”,也就是固化数据用的plsql程序段。大多数用于复杂逻辑的计算或重组数据进行保存。如果你想要查询数据,可以用select完成的事为什么要用存储过程呢?

接下来,说说你写的东西。这是语法问题,在plsql中,想要通过select语句获取表或视图中的某列或多列的值,需要在procere或function的body中的声名位置定义变量。在select时,使用into来将查询的列按顺序逐一赋值到对应的变量。这是plsql中的select 。。 into 。。句型的语法规则。代码我就不举例了,楼上写的没有问题。但是他的代码中需要注意的是,他返回的是一个结构,需要再写过程来解析结构,从而获取其中的列值。

希望对你有帮助。

㈡ Oracle如何创建存储过程和如何调用存储过程

【delphi+oracle报表解决方案(一)】delphi中调用oracle的存储过程(分带返回游标,不返回值两种)
关键字: delphi ,oracle存储过程,游标,返回数据集,报表注:delphi 6+ oracle 8.1.6一.创建包与包体1.附:建表aaclass为下面作测试用create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1
AS type rc_class is ref cursor;
--求p1,p2的和与差,返回的多个值通过游标返回
procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class);

--查询满足条件的数据集,返回数据集通过游标返回
procere GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)
procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number) ;
end PKG_JCCTEST1; 3.建包体CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1
ASprocere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class)
IS
BEGIN
open ResultCursor for
select p1-p2 as "sum", p1+p2 as "sub" from al;
END ;
procere GetClass2(a in number,ResultCursor out rc_class )
is
begin open ResultCursor for
select aaclass.* from aaclass where pnumber >a;end ;procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number)
is
begin
insert into aaclass values(p_cid,p_cname,p_pnumber) ;
-- commit;
end ; 二.在delphi中利用AdoDataSet调用上述第一个存储过程
1.利用AdoConnection1连接数据库(驱动为 oracle Provider for OLE DB),
**并在连接字符串中加入这一节: PLSQLRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:
procere TForm1.Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,45为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应
ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4); //下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ; //根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了 //此处的字段名根据包过程中的返回游标 对应的字段名来取
//定义的存储过程返回游标如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from al;
//把对应的字段值取出来即可
AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
BResult := ADODataSet1.Fields.FieldByName('sum').Value ; //显示结果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;end;
三.在delphi中利用AdoDataSet调用上述第二个存储过程
还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procere TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,20为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);
//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ; while not ADODataSet1.Eof do
begin
showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
) ;
ADODataSet1.Next ;
end ;
end; 四 利用adoquery调用第三个过程,不返回数据集的procere TForm1.Button3Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ; AdoQuery1.ExecSQL ;
end;
五 利用adoquery调用第一个过程,返回数据集的.
procere TForm1.Button4Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ; AdoQuery1.Open ; Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
string( AdoQuery1.FieldByName('sum').Value));
end;六.关于三层体系的此类问题两层的解决了,三层类似.
中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;
客户端用clientdataset ,大同小异,举例如下: begin
//调用相应的过程
ClientDataSet1.Close ;
ClientDataSet1.Params.Clear ; ClientDataSet1.CommandText := '{call PackageName.ProcereName(?,?)}' ;
ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1.Open ;

end ;
本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/yzsind/archive/2005/01/20/261176.aspx

㈢ oracle中怎样创建存储过程 csdn

oracle中怎样创建存储过程 csdn
--创建存储过程 IN_SHEETID 为输入参数CREATE OR REPLACE PROCEDURE ST_RECEIPT(IN_SHEETID VARCHAR2) ISBEGIN --将 receipt0表中数据插入 receipt INSERT INTO RECEIPT SELECT * FROM RECEIPT0 WHERE SHEETID = IN_SHEETID; --更新receipt表中Flag值 UPDATE RECEIPT SET FLAG = 100 WHERE SHEETID = IN_SHEETID; -- INSERT INTO RECEIPTITEM SELECT * FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID; --删除ReceiptItem0表数据 DELETE FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID; --删除 receipt0表数据 DELETE FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;END;--调用存储过程BEGIN ST_RECEIPT('ys141128');END;--或者EXEC ST_RECEIPT('ys141128');

㈣ oracle sql怎么创建存储过程

import java.sql. * ;
public class ProcereNoArgs
{
public static void main(String args[]) throws Exception
{
// 加载Oracle驱动
DriverManager.registerDriver( new oracle.jdbc.driver.OracleDriver());
// 获得Oracle数据库连接
Connection conn = DriverManager.getConnection( " jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd " );
// 创建存储过程的对象
CallableStatement c = conn.divpareCall( " {call pro1(?)} " );
// 给Oracle存储过程的参数设置值 ,将第一个参数的值设置成188
c.setInt( 1 , 188 );
// 执行Oracle存储过程
c.execute();
conn.close();
}
}

㈤ oracle 创建存储过程

--创建存储过程 IN_SHEETID 为输入参数CREATE OR REPLACE PROCEDURE ST_RECEIPT(IN_SHEETID VARCHAR2) ISBEGIN --将 receipt0表中数据插入 receipt INSERT INTO RECEIPT SELECT * FROM RECEIPT0 WHERE SHEETID = IN_SHEETID; --更新receipt表中Flag值 UPDATE RECEIPT SET FLAG = 100 WHERE SHEETID = IN_SHEETID; -- INSERT INTO RECEIPTITEM SELECT * FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID; --删除ReceiptItem0表数据 DELETE FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID; --删除 receipt0表数据 DELETE FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;END;--调用存储过程BEGIN ST_RECEIPT('ys141128');END;--或者EXEC ST_RECEIPT('ys141128');

㈥ oracle 创建存储过程 急啊

要知道
创建存储过程使用
pl/sql语言的
而且
end后面
要加
单引号
;
而且每个sql写完后也要
加但引号标示
在begin上面declare一个变量
随便命名
v_num
number
假设
student表里面有一个变量
是数字类型的

number
那么
这个sql应该这样写
create
or
replace
procere
testproc
is
declare
v_number
number;
begin
select
number
into
v_number
from
student;
end;

㈦ 在Oracle中创建存储过程

在command窗口先执行

SQL>setserveroutputon;

再执行

SQL>execaa();

结果:


hello

PL/SQL procere successfully completed

㈧ Oracle存储过程编写

Oracle存储过程基本语法:
CREATE?OR?REPLACE?PROCEDURE?存储过程名?
IS?
BEGIN?
NULL;?
END;解释:
行1:?
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;?
行2:?
IS关键词表明后面将跟随一个PL/SQL体。?
行3:?
BEGIN关键词表明PL/SQL体的开始。?
行4:?
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;?
行5:?
END关键词表明PL/SQL体的结束。

㈨ ORACLE如何创建存储过程,详细例子。

--创建存储过程 IN_SHEETID 为输入参数CREATE OR REPLACE <a class="-highlight" href="https://www..com/s?wd=PROCEDURE&tn=44039180_cpr&fenlei=-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank">PROCEDURE</a> ST_RECEIPT(IN_SHEETID VARCHAR2) ISBEGIN--将 receipt0表中数据插入 receiptINSERT INTO RECEIPTSELECT * FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;--更新receipt表中Flag值UPDATE RECEIPT SET FLAG = 100 WHERE SHEETID = IN_SHEETID;--INSERT INTO RECEIPTITEMSELECT * FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID;--删除ReceiptItem0表数据DELETE FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID;--删除 receipt0表数据DELETE FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;<a class="-highlight" href="https://www..com/s?wd=END&tn=44039180_cpr&fenlei=-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank">END</a>;--调用存储过程BEGINST_RECEIPT('ys141128');<a class="-highlight" href="https://www..com/s?wd=END&tn=44039180_cpr&fenlei=-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank">END</a>;--或者EXEC ST_RECEIPT('ys141128');

热点内容
linuxjdk是否安装 发布:2025-01-01 12:01:17 浏览:206
均值滑动算法 发布:2025-01-01 11:53:46 浏览:385
无线网加密设置 发布:2025-01-01 11:53:03 浏览:20
mfc画图源码 发布:2025-01-01 11:50:54 浏览:977
光遇小王子季什么时候结束安卓 发布:2025-01-01 11:43:10 浏览:954
腾讯云如何申请免费云服务器 发布:2025-01-01 11:42:14 浏览:345
uu跑腿跑男端抢单脚本靠谱不 发布:2025-01-01 11:28:33 浏览:345
pythonreshape1 发布:2025-01-01 11:24:18 浏览:361
编程转正表 发布:2025-01-01 11:24:10 浏览:189
创客编程需要什么配置电脑 发布:2025-01-01 11:22:44 浏览:499