oracle存储过程的创建和使用(oracle 创建存储过程 急啊)
本文目录
- oracle 创建存储过程 急啊
- Oracle下怎样创建存储过程
- 如何在Oracle中使用Java存储过程
- 怎样实现每天自动执行oracle的存储过程一次
- 如何开发ORACLE存储过程
- 急求!怎么建立oracle存储过程(实例)
- 怎么使用存储过程
- Oracle如何创建存储过程和如何调用存储过程
- oracle创建一个存储过程并调用它,问题如下:
- oracle存储过程基本语法
oracle 创建存储过程 急啊
要知道创建存储过程使用pl/sql语言的而且end后面要加单引号;而且每个sql写完后也要加但引号标示在begin上面declare一个变量随便命名v_numnumber假设student表里面有一个变量是数字类型的叫number那么这个sql应该这样写createorreplaceproceduretestprocisdeclarev_numbernumber;beginselectnumberintov_numberfromstudent;end;
Oracle下怎样创建存储过程
给你示例你参考下:----------------------------建立存储过程:CREATE OR REPLACE PROCEDURE P_name--存储过程名字(i_var in int, --输入参数1o_var OUT varchar2 --输出参数1)ISv_STR VARCHAR2(200); --定义存储过程内部的局部变量BEGIN--下面是存储过程的主体实现部分 v_STR := i_var; dbms_output.put_line(v_STR); o_var := v_STR;exception--错误异常处理部分 when others then dbms_output.put_line(sqlerrm);--打印错误信息END P_name;-----------------------------------调用存储过程示例:declare v_in int; v_out varchar2(50);begin v_in :=100; P_name (v_in,v_out); --调用存储过程P_name dbms_output.put_line(’存储过程输入结果为:’||v_out);exception--错误异常处理部分 when others then dbms_output.put_line(sqlerrm);--打印错误信息end;
如何在Oracle中使用Java存储过程
通常有三种方法来创建java存储过程。
1. 使用oracle的sql语句来创建:
e.g. 使用create or replace and compile java source named "《name》" as
后边跟上java源程序。要求类的方法必须是public static的,才能用于存储过程。
SQL》 create or replace and compile java source named "javademo1" as import java.sql.*; public class JavaDemo1 { public static void main(String argv) { System.out.println("hello, java demo1"); } } / Java 已创建。 SQL》 show errors java source "javademo1" 没有错误。 SQL》 create or replace procedure javademo1 as language java name ’JavaDemo1.main(java.lang.String)’; / 过程已创建。 SQL》 set serveroutput on SQL》 call javademo1(); 调用完成。 SQL》 call dbms_java.set_output(5000); 调用完成。 SQL》 call javademo1(); hello, java demo1 调用完成。 SQL》 call javademo1(); hello, java demo1 调用完成。
2. 使用外部class文件来装载创建
e.g. 这里既然用到了外部文件,必然要将class文件放到oracle Server的某一目录下边。
public class OracleJavaProc { public static void main(String argv) { System.out.println("It’s a Java Oracle procedure."); } } SQL》 grant create any directory to scott; 授权成功。 SQL》 conn scott/tiger@iihero.oracledb 已连接。 SQL》 create or replace directory test_dir as ’d:/oracle’; 目录已创建。 SQL》 create or replace java class using bfile(test_dir, ’OracleJavaProc.CLASS’) 2 / Java 已创建。 SQL》 create or replace procedure testjavaproc as language java name ’OracleJavaProc.main(java.lang.String)’; 2 / 过程已创建。 SQL》 call testjavaproc(); 调用完成。 SQL》 execute testjavaproc; PL/SQL 过程已成功完成。 SQL》 set serveroutput on size 5000 SQL》 call dbms_java.set_output(5000); 调用完成。 SQL》 execute testjavaproc; It’s a Java Oracle procedure.
3. 我推荐的一种方法,直接使用loadjava命令远程装载并创建。先创建一个类, e.g.
import java.sql.*; import oracle.jdbc.*; public class OracleJavaProc { //Add a salgrade to the database. public static void addSalGrade(int grade, int losal, int hisal) { System.out.println("Creating new salgrade for EMPLOYEE..."); try { Connection conn = DriverManager.getConnection("jdbc:default:connection:"); String sql = "INSERT INTO salgrade " + "(GRADE,LOSAL,HISAL) " + "VALUES(?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1,grade); pstmt.setInt(2,losal); pstmt.setInt(3,hisal); pstmt.executeUpdate(); pstmt.close(); } catch(SQLException e) { System.err.println("ERROR! Adding Salgrade: " + e.getMessage()); } } }
使用loadjava命令将其装载到服务器端并编译:
D:eclipse3.1workspacedbtest》loadjava -u scott/tiger@iihero.oracledb -v -resolve Or
acleJavaProc.java
arguments: ’-u’ ’scott/tiger@iihero.oracledb ’-v’ ’-resolve’ ’OracleJavaProc.java’
creating : source OracleJavaProc
loading : source OracleJavaProc
resolving: source OracleJavaProc
查询一下状态:
连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production SQL》 SELECT object_name, object_type, status FROM user_objects WHERE object_type LIKE ’JAVA%’; OBJECT_NAME -------------------------------------------------------------------------------- OBJECT_TYPE STATUS ------------------------------------ -------------- OracleJavaProc JAVA CLASS VALID OracleJavaProc JAVA SOURCE VALID
测试一下存储过程:
SQL》 create or replace procedure add_salgrade(id number, losal number, hisal num ber) as language java name ’OracleJavaProc.addSalGrade(int, int, int)’; 2 / 过程已创建。 SQL》 set serveroutput on size 2000 SQL》 call dbms_java.set_output(2000); 调用完成。 SQL》 execute add_salgrade(6, 10000, 15000); Creating new salgrade for EMPLOYEE... PL/SQL 过程已成功完成。 SQL》 select * from salgrade where grade=6; GRADE LOSAL HISAL ---------- ---------- ---------- 6 10000 15000
怎样实现每天自动执行oracle的存储过程一次
用joboracle定时器调用存储过程
1、创建一个表,为了能清楚看到定时器的运行情况我们创建一个带有日期字段的表Sql代码 create table job_table(run_time date); create table job_table(run_time date);
2、创建存储过程Sql代码 create or replace procedure job_proc is begininsert into job_table (run_time) values (sysdate); end; create or replace procedure job_proc isbegininsert into job_table (run_time) values (sysdate);end;
3、创建job,并且指定为一分钟执行一次Sql代码 declarejob number; begindbms_job.submit(job, ’job_proc;’, sysdate, ’TRUNC(sysdate,’’mi’’) + 1 / (24*60)’); end/ commit; declarejob number;begindbms_job.submit(job, ’job_proc;’, sysdate, ’TRUNC(sysdate,’’mi’’) + 1 / (24*60)’);end/commit;4.创建之后自动处于运行状态,我们查询job表,看看我们创建的jobSql代码 select job,broken,what,interval,t.* from user_jobs t; select job,broken,what,interval,t.* from user_jobs t; job broken what interval ... 81 N job_proc; TRUNC(sysdate,’mi’) + 1 / (24*60) ...
用joboracle定时器调用存储过程
创建一个表,为了能清楚看到定时器的运行情况我们创建一个带有日期字段的表Sql代码 create table job_table(run_time date); create table job_table(run_time date);2.创建存储过程Sql代码 create or replace procedure job_proc is begininsert into job_table (run_time) values (sysdate); end; create or replace procedure job_proc isbegininsert into job_table (run_time) values (sysdate);end;
3.创建job,并且指定为一分钟执行一次Sql代码 declarejob number; begindbms_job.submit(job, ’job_proc;’, sysdate, ’TRUNC(sysdate,’’mi’’) + 1 / (24*60)’); end/ commit; declarejob number;begindbms_job.submit(job, ’job_proc;’, sysdate, ’TRUNC(sysdate,’’mi’’) + 1 / (24*60)’);end/commit;4.创建之后自动处于运行状态,我们查询job表,看看我们创建的jobSql代码 select job,broken,what,interval,t.* from user_jobs t; select job,broken,what,interval,t.* from user_jobs t; job broken what interval ... 81 N job_proc; TRUNC(sysdate,’mi’) + 1 / (24*60) ...
如何开发ORACLE存储过程
简单地讲,Oracle存储过程就是存储在Oracle数据库中的一个程序。 一. 概述 Oracle存储过程开发的要点是: · 使用Notepad文本器,用Oracle PL/SQL编程语言写一个存储过程; ·在Oracle数据库中创建一个存储过程; ·在Oracle数据库中使用SQL*Plus工具运行存储过程; ·在Oracle数据库中修改存储过程; · 通过编译错误调试存储过程; · 删除存储过程; 二.环境配置 包括以下内容: · 一个文本器Notepad; · Oracle SQL*Plus工具,提交Oracle SQL和PL/SQL 语句到Oracle database。 · Oracle 10g express数据库,它是免费使用的版本; 需要的技巧: · SQL基础知识,包括插入、修改、删除等 · 使用Oracle’s SQL*Plus工具的基本技巧; · 使用Oracle’s PL/SQL 编程语言的基本技巧; 三.写一个存储过程 存储过程使用Oracle’s PL/SQL 程序语言编写,让我们写一个什么工作都不做的存储过程,我们可以编译和运行它而不用担心会对数据库产生任何损害。 在Notepad, 写下: CREATE OR REPLACE PROCEDURE skeleton IS BEGIN NULL; END; 把文件存为skeleton.sql. 让我们一行行遍历这个存储过程: 1 CREATE OR REPLACE PROCEDURE skeleton 2 IS 3 BEGIN 4 NULL; 5 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体的结束 四.创建一个存储过程 SQL语句CREATE OR REPLACE PROCEDURE在Oracle数据库中创建、编译和保存一个存储过程。 从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;打开skeleton.sql文件. 在SQL》命令提示符下输入以下命令: SQL》@skeleton SQL》/ SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区并且执行SQL*Plus语句;SQL*Plus 会通知你存储过程已经被成功地创建。 现在你的存储过程被创建,编译和保存在你的Oracle数据库,我们可以运行它。 五.运行一个存储过程 从SQL*Plus 命令行提示符运行你的存储过程使用EXECUTE命令,如下: SQL》 EXECUTE skeleton; SQL*Plus 输出一下信息确信存储过程成功执行: PL/SQL procedure successfully completed. 你也可以在一个无名PL/SQL块内运行你的存储过程,在SQL*Plus命令提示符下,它看起来像: SQL》 BEGIN 2 SKELETON; 3 END; 4 / 现在我们已经运行了我们的存储过程,我们如何修改它呢? 六.修改一个存储过程 让我们写一个输出字符串“Hello World!”的存储过程,用Notepad打开你的skeleton.sql 文件,. 用DBMS_OUTPUT.PUT_LINE 过程调用去替换NULL语句,如下所示: CREATE OR REPLACE PROCEDURE skeleton IS BEGIN DBMS_OUTPUT.PUT_LINE(’Hello World!’); END; 保存到文件skeleton.sql. 从SQL*Plus命令行, 打开文件skeleton.sql . SQL》 @skeleton SQL》 1 CREATE OR REPLACE PROCEDURE skeleton 2 IS 3 BEGIN 4 DBMS_OUTPUT.PUT_LINE(’Hello World!’); 5* END; SQL》 / SQL*Plus 通知你存储过程成功创建并输出提示信息:Procedure created. SQL》 用EXECUTE 命令运行你的存储过程: SQL》 EXECUTE skeleton; SQL*Plus显示存储过程运行成功:PL/SQL procedure successfully completed. 我们想要的输出字符串 "Hello World!"没有出来,在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令,在SQL*Plus 命令行提示符,键入: SQL》 SET SERVEROUTPUT ON 再次执行你的存储过程: SQL》 EXECUTE skeleton; 现在结果输出了:Hello World! PL/SQL procedure successfully completed. 七.调试一个存储过程 当调试一个存储过程时,遵循一样的步骤,修改SQL文件,创建存储过程,执行存储过程,根据编译器反馈的出错信息进行修改,这一步是非常繁琐的,需要依靠经验。 在实际的商用存储过程的开发调试过程中,由于涉及很多表、类型、光标、循环、条件等复杂的逻辑,和PL/SQL语句的灵活运用,编译时会产生很多错误提示信息,程序员在根据这些错误信息定位,进行修正,再编译最后得到正确的结构; 八.放弃一个存储过程 如果在数据库中你不在需要一个存储过程你可以删除它,SQL语句 DROP PROCEDURE 完成从数据库中删除一个存储过程,DROP PROCEDURE 在SQL中被归类为数据定义语言(DDL) 类操作,其他的例子有CREATE, ALTER, RENAME 和TRUNCATE。. 在SQL*Plus 命令提示符下,使用DROP PROCEDURE SQL 语句删除你的叫做skeleton的存储过程: SQL》 DROP PROCEDURE skeleton; SQL*Plus assures us the procedure has been removed: Procedure dropped. 总结 本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用,也可能被触发器调用。
急求!怎么建立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’);
怎么使用存储过程
问题一:SQL 中存储过程怎么使用? sql存储过程及应用 一、简介: 存储过程(Stored Procedure), 是一组为了完成特定功能的SQL 语句,集经编译后 存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行 它, 在SQL Server 的系列版本中,存储过程分为两类:系统提供的存储过程和用户自定义存储过程 。 系统SP,主要存储master 数据库中,并以sp_为前缀并且系统存储过程主要是从系统表中获取 信息,从而为系统管理员管理SQL Server。用户自定义存储过程是由用户创建,并能完成 某一特定功能,如:查询用户所需数据信息的存储过程。 存储过程具有以下优点 1.存储过程允许标准组件式编程(模块化设计) 存储过程在被创建以后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而 且数 据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响。因为应用程序源代 码只包含存 储过程的调用语句,从而极大地提高了程序的可移植性。 2.存储过程能够实现快速的执行速度 如果某一操作包含大量的Transaction-SQL 代码,,或分别被多次执行,那么存储过程要比批处理 的 执行速度快很多,因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进 行分析优 化,并给出最终被存在系统表中的执行计划,而批处理的Transaction-SQL 语句在每次运行时 都要进行 编译和优化,因此速度相对要慢一些。 3.存储过程能够减少网络流量 对于同一个针对数据数据库对象的操作,如查询修改,如果这一操作所涉及到的Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调 用语句,否 则将是多条SQL 语句从而大大增加了网络流量降低网络负载。 4.存储过程可被作为一种安全机制来充分利用 系统管理员通过,对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的 限 制。 二、变量 @I 三、流程控制语句(if else | select case | while ) Select ... CASE 实例 DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = ’1’ Select @iRet = CASE WHEN @PKDisp = ’一’ THEN 1 WHEN @PKDisp = ’二’ THEN 2 WHEN @PKDisp = ’三’ THEN 3 WHEN @PKDisp = ’四’ THEN 4 WHEN @PKDisp = ’五’ THEN 5 ELSE 100 END 四、存储过程格式 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO *********************************************************/ -- 变量的声明,sql里面声明变量时必须在变量前加@符号 DECLARE @I INT -- 变量的赋值,变量赋值时变量前必须加set SET @I = 30 -- 声明多个变量 DECLARE @s varchar(10),@a INT -- Sql 里if语句 IF 条件 BEGIN 执行语句 END ELSE BEGIN ......》》 问题二:SQL存储过程如何调用存储过程? 在存储过程里用exec 执行另一存储过程名及它需要的参数就可以了 如 exec抚abc ’1’, ’2’(abc 是存储过程的名字, ’1’,’2’ 是它的参数 问题三:oracle中的存储过程,有什么作用,以及怎么在代码中使用? 楼上也不知道从哪扒下来的,一看LZ就是初学,举点例子不行吗? 比如建立个测试表 create table test(id int,name varchar2(10),counts int); insert into test values (1,’张三’,100);insert into test values (2,’李四’,200); mit; 现在给你出个题目是 查询所有人加在一起的counts是多少 创建存储过程 create or replace p_test --创建存储过程,asv_counts int;--定义变量begin --开始select sum(counts) into v_counts from test;--将得到的结果放到变量里DBMS_OUTPUT.PUT_LINE(v_counts);--将结果打印输出end;--结束 执行这种不带输入参数的 begin p_test;end; 然后你检查下结果 再给你创建一个带输入参数的 题目是,查询id为1的人名是什么 create or replace p_test1(v_id int)asv_name varchar2(10);beginselect name into v_name from test where id=v_id;DBMS_OUTPUT.PUT_LINE(v_name);end; 执行时这样 beginp_test1(1);end; 第2个我没给你写注释,你看你自己应该能理解吧 补充一下,存储过程不一定只是执行查询,也可以做删除或者修改等sql语句,总体来说就是几个或N个sql语句的 *** ,来完成系统内某些特定的需求,这些需求可以是一个sql搞定的,也可以是多个sql组合的 问题四:sql server怎么调用存储过程 在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库操作中调用其它的存储过程,下面介绍其调用的方法 在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库操作中调用其它的存储过程,下面介绍其调用的方法 一、SQL SERVER中调用不带输出参数的存储过程 SQL 代码 --存储过程的定义 create procedure ( @m_viewcount int = 0 ,@m_hotcount int = 0 ) as go --存储过程的调用 declare @m_viewcount int declare @m_hotcount int exec sp_add_product @m_viewcount,@m_hotcount 二、SQL SERVER中调用带输出参数的存储过程 SQL 代码 --定义存储过程 create procedure ( @m_viewcount int = 0 ,@m_hotcount int output ) --存储过程的调用 declare @m_viewcount int =0 declare @m_hotcount int exec dbo.sp_add_product @m_viewcount,@m_hotcount output 问题五:怎样调用存储过程里面的存储过程 这里一定要用Closed,因为其他非Closed状态再执行Open时会引发不能重复开启的异常 if (sqlConn.State != ConnectionState.Closed) sqlConn.Open(); Sqlmand sqlCmd = new Sqlmand(); sqlCmd.Connection = sqlConn; sqlCmd.mandText = proc_history; sqlCmd.mandType = mandType.StoredProcedure;sqlCmd.Parameters.Add(new SqlParameter(@like, NewTitle)); 如果要返回数据集,则不要调用sqlCmd.ExecuteNonQuery();,直接调用下面的方法 SqlDataAdapter sqlDA = new SqlDataAdapter(sqlCmd); DataSet ds = new DataSet(); sqlDA.Fill(ds); return ds; 如果是执行DML语句,就直接调用如下 sqlCmd.ExecuteNonQuery(); /* 以上两种情况不可同时存在 */ 问题六:怎么在PL/SQL Developer 中调用存储过程呢? 看你存储过程里是否有参数了 正常的话,在左边列表找到procedure里找到你写的那存储过程名,看上边有红叉没,没红叉就是编译成功,有红叉就是还有问题,需要改 然后右键点这个存储过程,(中文版选择测试按钮,英文版选择test按钮),然后下边有输入参数的地方,输入,点上边的齿轮即可 还有种方法,就是开一个sql窗口,写以下代码 begin 存储过程名; end; 然后点齿轮运行,注意两个分号不可少 问题七:数据库中的存储过程怎么用 啊!!求解..... 10分 关键字:procedure 例子: SQL》 create procedure procedure_name is begin --开始执行 insert into test(’10001’,’Visket’); end; / 以上操作就能为test表添加一条信息 执行存储过程procedure用的命令是exec 记住存储过程中,语句结尾一定要有分号 问题八:ORACLE存储过程怎么调用? PL/SQL SQL窗口 输入存储过程名,右键测试(英文版为test唬,出现测试界面,输入对应参数后F8,如果没有参数直接F8. 问题九:存储过程中怎么使用row 一般分为十种情况,每种语法各不相同: 1、 创建语法create proc | procedure pro_name as SQL_statements2、 创建不带参数存储过程--创建存储过程if (exists (select * from sys.objects where name = ’proc_get_student’)) drop proc proc_get_studentgocreate proc proc_get_studentas select * from student;--调用、执行存储过程exec proc_get_student;3、 修改存储过程--修改存储过程alter proc proc_get_studentasselect * from student;4、 带参存储过程--带参存储过程if (object_id(’proc_find_stu’, ’P’) is not null) drop proc proc_find_stugocreate proc proc_find_stu(@startId int, @endId int)as select * from student where id between @startId and @endIdgoexec proc_find_stu 2, 4;5、 带通配符参数存储过程--带通配符参数存储过程if (object_id(’proc_findStudentByName’, ’P’) is not null) drop proc proc_findStudentByNamegocreate proc proc_findStudentByName(@name varchar(20) = ’%j%’, @nextName varchar(20) = ’%’)as select * from student where name like @name and name like @nextName;goexec proc_findStudentByName;exec proc_findStudentByName ’%o%’, ’t%’;6、 带输出参数存储过程if (object_id(’proc_getStudentRecord’, ’P’) is not null) drop proc proc_getStudentRecordgocreate proc proc_getStudentRecord( @id int, --默认输入参数 @name varchar(20) out, --输出参数 @age varchar(20) output--输入输出参数)as select @name = name, @age = age from student where id = @id and sex = @age;go-- declare @id int, @name varchar(20), @temp varchar(20)......》》 问题十:如何使用sql语句查看存储过程 --下面这条语句可以查看存储过程具体代码exec sp_helptext 存储过程名--下面这条语句查看数据库中有哪些存储过程select * from sysobjects where type=’P’
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的和与差,返回的多个值通过游标返回 procedure GetSubAndSum2(p1 number,p2 number , ResultCursor out rc_class); --查询满足条件的数据集,返回数据集通过游标返回 procedure GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集) procedure InsertClass( p_cid varchar2 ,p_cname varchar2 , p_pnumber number) ;end PKG_JCCTEST1; 3.建包体CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1 ASprocedure GetSubAndSum2(p1 number,p2 number , ResultCursor out rc_class)ISBEGIN open ResultCursor for select p1-p2 as "sum", p1+p2 as "sub" from dual;END ;procedure GetClass2(a in number,ResultCursor out rc_class )isbegin open ResultCursor for select aaclass.* from aaclass where pnumber 》a;end ;procedure InsertClass( p_cid varchar2 ,p_cname varchar2 , p_pnumber number) isbegin 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,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:procedure 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 dual; //把对应的字段值取出来即可 AResult := ADODataSet1.Fields.FieldByName(’sub’).Value ; BResult := ADODataSet1.Fields.FieldByName(’sum’).Value ; //显示结果 showmessage(inttostr(AResult)) ; showmessage(inttostr(BResult)) ;end; 三.在delphi中利用AdoDataSet调用上述第二个存储过程 还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procedure 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调用第三个过程,不返回数据集的procedure 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调用第一个过程,返回数据集的.procedure 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.ProcedureName(?,?)}’ ; ClientDataSet1.Params.CreateParam(ftInteger , ’ParamName1’, ptInput) ; ClientDataSet1.Open ; end ;***隐藏网址***
oracle创建一个存储过程并调用它,问题如下:
先要创建一个表,表名自己定义,这里比如叫emp_tmp
create table emp_tmp(dname varchar2(50),sal number(10,2));
创建存储过程
create procedure p_salasbegininsert into emp_tmp select a.dname,sum(b.sal) from dept a,emp b where a.deptno=b.deptno and b.job=’MGR’;commit;end;
这还用注释么?就是一句sql语句其实
oracle存储过程基本语法
一:存储过程 创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限 删除存储过程,是过程的创建者或者拥有DROP ANY PROCEDURE系统权限 修改存储过程,则只能是过程的创建者或者拥有ALTER ANY PROCEDURE系统权限的人 执行(或调用)存储过程,是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人1:语法 1)创建 CREATE {AS|IS} BEGIN 可执行部分 END; 说明: 参数是可选的,但只能是IN类型(IN关键字可以省略)。 在定义部分的RETURN 数据类型,用来表示函数的数据类型,也就是返回值的类型,不可省略。 在可执行部分的RETURN(表达式),用来生成函数的返回值,其表达式的类型应该和定义部分说明的函数返回值的数据类型一致。在函数的执行部分可以有多个RETURN语句,但只有一个RETURN语句会被执行,一旦执行了RETURN语句,则函数结束并返回调用环境。 2)删除 DROP FUNCTION 函数名; 3)修改 ALTER PROCEDURE 函数名 COMPILE; 4)执行 变量名:=函数名(...) 三:对存储过程 和 函数的查看(可以通过对数据字典【USER_SOURCE】的访问来查询存储过程或函数的有关信息) 1:查询某个存储过程序内容 select TEXT from user_source WHERE NAME=’存储过程名’; 2:查看数据字殿 DESCRIBE USER_SOURCE ; //命令行中 3:查看存储过程的参数 DESCRIBE say_hello; //后面是过程名 4:查看发生错误 SHOW ERRORS ; 5:查询一个存储过程或函数是否是有效状态(即编译成功) SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME=’过程名’;//注意大小写 VALID表示该存储过程有效(即通过编译),INVALID表示存储过程无效或需要重新编译。它的状态会改变,这与它依赖外部表(表删除修改等操作)有关系 6:查看存储过程与表的依赖关系 SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME=’SAY_HELLO’; 说明 NAME为实体名,TYPE为实体类型,REFERENCED_OWNER为涉及到的实体拥有者账户,REFERENCED_NAME为涉及到的实体名,REFERENCED_TYPE 为涉及到的实体类型。 问题: 如果一个用户A被授予执行属于用户B的一个存储过程的权限,在用户B的存储过程中,访问到用户C的表,用户B被授予访问用户C的表的权限,但用户A没有被授予访问用户C表的权限,那么用户A调用用户B的存储过程是失败的还是成功的呢?答案是成功的。
更多文章:
字体样式变化多端还是变幻莫测(形容变化多端的四字词语及解释)
2024年7月18日 02:27
graphics 630显卡怎么样(超核心显卡uhd 630怎么样)
2024年7月8日 03:17
align with用法(in align with是什么意思)
2024年7月9日 11:34
云手机制作教程(侠众道手游云手机多开需要怎么做能不能给点建议)
2024年10月12日 02:10
学java有没有半途而废的(大四快毕业了,现在学java来得及吗有什么好的学习方法或步骤)
2024年7月20日 08:45
apple tree(apple tree里的apple到底是苹果 还是苹果树的意思 为何字典上还有apple指苹果树)
2024年8月6日 12:45
web前端开发工程师网页设计(web前端工程师和网页设计师的区别)
2024年7月10日 18:24
fontcreator调整字体间距(high-logic fontcreator如何修改字体大小)
2024年8月10日 17:35
myeclipse快捷键大全(求MyEclipse 7.0所有快捷键)
2024年6月24日 16:46
onsubmit是网页中的事件吗(JavaScript中,当用户表单填写不正确,如果通过JavaScript阻止用户提交表单)
2024年7月16日 06:18