当前位置:首页 » 编程语言 » plsqlinout
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

plsqlinout

发布时间: 2022-01-23 21:34:28

㈠ 如何开发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 procere 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 通知你存储过程成功创建并输出提示信息:Procere created. SQL> 用EXECUTE 命令运行你的存储过程: SQL> EXECUTE skeleton; SQL*Plus显示存储过程运行成功:PL/SQL procere successfully completed. 我们想要的输出字符串 "Hello World!"没有出来,在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令,在SQL*Plus 命令行提示符,键入: SQL> SET SERVEROUTPUT ON 再次执行你的存储过程: SQL> EXECUTE skeleton; 现在结果输出了:Hello World! PL/SQL procere 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 procere has been removed: Procere dropped. 总结 本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用,也可能被触发器调用。

㈡ plsql问题3

--设:日期(date) 收入(income) 支出(payout) 余额(balance)

1.使用窗口函数和sum() 来做累计: sum()over():
select a.date , a.income,a.payout
,sum(a.income-a.payout)over(partition by a.date , a.income) balance
from mytable a
order by 1;

2.

insert into mytable values ('2000/3/5',60,10);
commit;

select a.date , a.income,a.payout
,sum(a.income-a.payout)over(partition by a.date , a.income) balance
from mytable a
order by 1;

3.
2000/3/3 0 0 5
2000/3/4 0 0 5
insert into mytable values ('2000/3/3',0,0);
commit;

insert into mytable values ('2000/3/4',0,0);
commit;

select a.date , a.income,a.payout
,sum(a.income-a.payout)over(partition by a.date , a.income) balance
from mytable a
order by 1;

㈢ pl/sql where 后面的字段名是变量 怎么写

可以。。但最好是输入参数(in)或者输入输出参数(inout)因为,如果是在过程中声明的变量你还需要对他赋值,所以干脆从外部输入或者在变量名之前加&符号,这样在语句执行到此处时就会提示你手动输入一个值。

select * from table where v_abc = 'abc';这句有错误
应该写成:
v_abc:='abc'; --先赋值
select * from table where column_name = v_abc;

column_name 是表中已经存在的列名
当然,v_abc的类型要与column_name的类型相同,你可以通过“v_abc table.column_name%type”这种声明方式保证他们类型的一致性。

祝你成功 ^^ )

㈣ pl/sql,有两个循环,内循环跟外循环,现在要外循环一次再内循环一次,总共这样五次,如何弄高手帮帮忙

你的问题描述不清楚,不知道是不是这个意思
1 declare
2 i int :=1;
3 m int :=0;
4 begin
5 <<outer>>
6 while i<=5 loop
7 i :=i+1;
8 dbms_output.put_line('out');
9 m:=0;
10 <<inner>>
11 loop
12 m:=m+1;
13 dbms_output.put_line('in');
14 exit when m=1;
15 end loop inner;
16 end loop outer;
17* end;
SYS@orcl>> /
out
in
out
in
out
in
out
in
out
in

㈤ PL/SQL的执行操作

过程:执行特定操作

函数:用于返回特定数据 语法:create [orreplace] procere procere_name(argument1 [model]datatype1,argment2 [mode2],...)
is [as]
pl/sql block;
1.建立过程:不带任何参数
create or replaceprocecre out_time
is
begin
dbms_output.put_line(systimestamp);
end;
2.调用过程
set serveroutput on
exec out_time
set serveroutput on
call out_time();
3.建立过程:带有IN参数
CREATE OR REPLACE PROCEDURE add_employee(eno NUMBER,NAME VARCHAR2,sal NUMBER,job VARCHAR2 DEFAULT 'clerk',dno NUMBER) ISe_integrity EXCEPTION;PRAGMA EXCEPTION_INIT(e_integrity, -2291);BEGININSERT intoimp(empno,ename,sal,job,deptno)VALUES(eno,NAME,sal,job,dno);EXCEPTIONWHEN p_val_on_index THENraise_application_error(-20000, '雇员号不能重复');WHEN e_integrity THENraise_application_error(-20001, '部门不存在');END add_employee;
4.建立过程:带有OUT参数
create or replaceprocere qry_employee
(eno number,name outvarchar2,salary out number)
is
begin
selectename,sal into name,salary from emp where empno=eno;
exception
whenno_date_found then
raise_application_error(-20000,'该雇员不存在');
end;
当在应用程序中调用该过程时,必须要定义变量接受输出参数的数据
sql>var name varchar2(10)
var salary number
exec qry_employee(7788,:name,:salary)
print name salary
5.建立过程:带有INOUT参数(输入输出参数)
create or replaceprocere compute
(num1 in outnumber,num2 in out number)
is
v1number;
v2number;
begin
v1:num1/num2;
v2:mod(num1,num2);
num1:=v1;
num2:=v2;
end;
sql>var n1 number
var n2 number
exec :n1:=100
exec :n2:=30
exec ecmpute(:n1,:n2)
print n1 n2
6.为参数传递变量和数据
位置传递,名称传递,组合传递三种
1.位置传递:在调用子程序时按照参数定义的顺序为参数指定相应的变量或数值
exec add_dept(40,'sales','new york');
exec add_dept(10);
2.名称传递:在调用子程序时指定参数名,并使用关联符号=>为其提供相应的数值或变量
execadd_dept(dname=>'sales',dno=>50);
exec add_dept(dno=>30);
3.组合传递:同时使用位置传递和名称传递
exec add_dept(50,loc=>'new york');
execadd_dept(60,dname=>'sales',loc=>'newyork');
7.查看过程原代码
oracle会将过程名,源代码以及其执行代码存放到数据字典中.执行时直接按照其执行代码执行
可查询数据字典(user_source)
select textfrom user_source where name='add_dept';
删除过程
dropprocere add_dept; 用于返回特定函数
语法:create [orreplace] function function_name
(argument1 [mode1] datatype1,
argument2 [mode2] datatype2,
.....)
returndatatype --函数头部必须要带有RETURN子句,至少要包含一条RETURN语句
is|as pl/sql block;
1.建立函数:不带任何参数
create or replacefunction get_user
return varchar2
is
v_uservarchar2(100);
begin
selectusername into v_user from user_users;
returnv_user;
end;
2.使用变量接受函数返回值
sql>var v1 varchar2(100)
exec :v1:=get_user
print v1
在SQL语句中直接调用函数
selectget_user from d l;
使用DBMS_OUTPUT调用函数
setserveroutput on
execdbms_output.put_line('当前数据库用户:'||ger_user)
3.建立函数:带有IN参数
create orreplace function get_sal(name in varchar2)
returnnumber
as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where upper(ename)=upper(name);
return v_sal;
exception
when no_data_found then
raise_application_error(-20000,'该雇员不存在');
end;
4.建立函数:带有out参数
create or replacefunction get_info(name varchar2,title out varchar2)
return varchar2
as
deptnamedept.dname%type;
begin
selecta.job,b.dname into title,deptname from emp a,dept b anda.deptno=b.deptno
anpper(a.ename)=upper(name);
returndeptname
exception
whenno_data_found then
raise_application_error(-20000,'该雇员不存在');
end;
sql>var job varchar2(20)
var dname varchar2(20)
exec :dname:=get_info('scott',:job)
print danme job
5.建立函数:带有INOUT参数
create or replacefunction result(num1 number,num2 in out number)
return number
as
v_resultnumber(6);
v_remaindernumber;
begin
v_result:=num1/num2;
v_remainder:=mod(num1,num2);
num2:=v_remainder;
returnv_result;
exception
whenzero_divide then
raise_application_error(-20000,'不能除0');
end;
sql>var result1 number
var result2 number
exec :result2:=30
exec :result1:=result(100,:result2)
print result result2
6.函数调用限制
SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数
SQL只能调用带有输入参数,不能带有输出,输入输出函数
SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)
SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句
7.查看函数源代码
oracle会将函数名及其源代码信息存放到数据字典中user_source
set pagesize 40
select text fromuser_source where name='result';
8.删除函数
drop functionresult; 1.列出当前用户的子程序
数据字典视图USER_OBJECTS用于显示当前用户所包含的所有对象.(表,视图,索引,过程,函数,包)
sql>col object_name format a20
select object_name,created,status from user_objects whereobject_type in ('procere','function')
2.列出子程序源代码
select text fromuser_source where name='raise_salsry';
3.列出子程序编译错误
使用SHOWERRORS命令确定错误原因和位置
show errorsprocere raise_salary
使用数据字典视图USER_ERRORS确定错误原因和位置
col text formata50
selectline||'/'||position as line/col,text error from user_errors wherename='raise_salary';
4.列出对象依赖关系
使用数据字典视图USER_DEPENDENCIES确定直接依赖关系
select name,typefrom user_dependencies where referenced_name='emp';
使用工具视图DEPTREE和IDEPTREE确定直接依赖和间接依赖关系
先运行SQL脚本UTLDTREE.SQL来建立这两个视图和过程DEPTREE_FILL,然后调用DEPTREE_FILL填充这两个视图
sql>@%oracle_home% dbmsadminutldtree
exec deptree_fill('TABLE','scott','emp')
执行后会将直接或间接依赖于SCOTT.EMP表的所有对象填充到视图DEPTREE和IDEPTREE中.
select nested_level,name,type from deptree;
select * from ideptree
5.重新编译子程序
当修改了被引用对象的结构时,就会将相关依赖对象转变为无效(INVALID)状态。
alter table emp addremark varchar2(10);
selectobject_name,object_type from user_objects wherestatus='invalid';
为了避免子程序的运行错误,应该重新编译这些存储对象
alter procereadd_employee compile;
alter view dept10compile;
alter functionget_info compile; 包用于逻辑组合相关的PL/SQL类型,项和子程序,由包规范和包体组成
1.建立包规范:包规范是包与应用程序之间的接口,用于定义包的公用组件,包括常量,变量,游标,过程,函数等
create [or replace]package package_name
is|as
p lic type and item declarations
s program specificationsend package_name;
create or replacepackage emp_package is
g_deptnonumber(3):=30;
procereadd_employee(eno number,name varchar2,salary number,dno numberdefault g_deptno);
procerefire_employee(eno number);
functionget_sal(eno number) return number;
end emp_package;
2.建立包体:用于实现包规范所定义的过程和函数
create [or replace]package body package_name
is|as
private type and item declarations
s program bodies
endpackage_name;
create or repalce package body emp_package is
functionvalidate_deptno(v_deptno number)
return boolean
is
v_temp int;
begin
select 1 into v_temp from dept where deptno=v_deptno;
return tr;
exception
when no_date_found then
return false;
end;
procere add_employee(eno number,name varchar2,salary number,dnonumber default g_deptno)
is
begin
if validate_deptno(dno) then
insert into emp(empno,ename,sal,deptno)vals(eno,name,salsry,dno);
else
raise_application_error(-20010,'不存在该部门');
end if;
exception
when p_val_on_index then
raise_application_error(-20012,'该雇员已存在');
end;
procere fire_employee(eno number) is
begin
delete from emp where empno=eno;
if sql%notfound then
raise_application_error(-20012,'该雇员不存在');
end if;
end;
functionget_sal(eno number) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=eno;
return v_sal;
exception
whenno_data_found then
raise_application_error(-20012,'该雇员不存在');
end;
end emp_package;
3.调用包组件
3.1在同一个包内调用包组件
create or replacepackage body emp_package is
procere add_employee(eno number,name va har2,salary number,dnonumber default g_deptno)
is
begin
ifvalidate_deptno(dno) then
insert into emp(empno,ename,sal,deptno)vals(eno,name,salary,dno);
else
raise_application_error(-20010,'该部门不存在')
end if;
exception
when p_val_on_index then
raise_application_error(-20011,'该雇员已存在')
end;
.........
3.2调用包公用变量
execemp_package.g_deptno:=20
3.3调用包公用过程
execemp_package.add_employee(1111,'mary',2000)
3.4调用包公用函数
var salarynumber
exec:salary:=emp_package.get_sal(7788)
print salary
3.5以其他用户身份调用包公用组件
connsystem/manager
execscott.emp_package.add_employee(1115,'scott',1200)
execscott.emp_package.fire_employee(1115)
3.6调用远程数据库包的公用组件
execemp_package.add_employee@orasrv(1116,'scott',1200)
4.查看源代码:存放在数据字典USER_SCOURCE中
select text fromuser_source where name='emp-package' and type='package';
5.删除包
drop packageemp_package;
6.使用包重载
重载(overload)是指多个具有相同名称的子程序
1.建立包规范
同名的过程和函数必须具有不同的输入参数,同名函数返回值的数据类型必须完全相同
create or replacepackage overload is
functionget_sal(eno number) return number;
functionget_sal(name varchar2) return number;
procerefile_employee(eno number);
procerefile_employee(name varchar2);
end;
2.建立包体
必须要给不同的重载过程和重载函数提供不同的实现代码
create or replacepackage body overload is
function get_sal(eno number) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=eno;
return v_sal;
exception
when no_data_found then
raise_application_error(-20020,'该雇员不存在');
end;
function get_sal(name varchar2) return number
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where upper(ename)=upper(name);
return v_sal;
exception
when no_data_found then
raise_application_error(-20020,'该雇员不存在');
end;
procere fire_employee(eno number) is
begin
delete from emp where empno=no;
if sql%notfound then
raise_application_error(-20020,'该雇员不存在');
end if;
end;
procerefire_employee(name varchar2) is
begin
delete from emp where upper(ename)=upper(name);
if sql%notfound then
raise_application_error(-20020,'该雇员不存在');
end if;
end;
end;
3.调用重载过程和重载函数
var sal1 number
var sal2 number
exec:sal1:=overload.get_sal('scott')
exec:sal2:=overload.get_sal(7685)
execoverload.fire_employee(7369)
execoverload.fire_employee('scott')
7.使用包构造过程
类似于高级语言中的构造函数和构造方法
1.建立包规范
包的构造过程用于初始化包的全局变量.
create or replacepackage emp_package is
minsalnumber(6,2);
maxsalnumber(6,2);
procereadd_employee(eno number,name varchar2,salary number,dnonumber);
procereupd_sal(eno number,salary number);
procereupd_sal(name varchar2,salary number);
end;
2.建立包体
包的构造过程没有任何名称,它是实现了包的其他过程后,以BEGIN开始,END结束的部分
create or replacepackage body emp_package is
procereadd_employee(eno number,name varchar2,salary number,dno number)
is
begin
if salarybetween minsal and maxsal then
insert into emp (empno,ename,sal,deptno)vals(eno,name,salary,dno);
else
raise_application_error(-20001,'工资不在范围内');
end if;
exception
when p_val_on_index then
raise_application_error(-20002,'该雇员已经存在');
end;
procereupd_sal(eno number,salary number) is
begin
if salary between minsal and maxsal then
update emp set sal=salary where empno =eno;
if sql%notfound then
raise_application_error(-20003,'不存在雇员号');
end if;
else
raise_application_errpr(-20001,'工资不在范围内');
end if;
end;
procere upd_sal(name varchar2,salary number) is
begin
if salary between minsal and maxsal then
update emp set sal=salary where upper(ename)=upper(name);
if sql%notfound then
raise_application_error(-20004,'不存在该雇员名');
end if;
else
raise_application_error(-20001,'工资不在范围内');
end if;
end;
begin
selectmi(sal),max(sal) into minsal,maxsal from emp ;
end;
调用包公用组件:构造过程只调用一次
execemp_package.add_employee(1111,'mary',3000,20)
execemp_package.upd_sal('mary',2000)
8.使用纯度级别
在SQL中引用包的公用函数,该公用函数不能包含DML语句(insert,update,delete),也不能读写远程包的变量
为了对包的公用函数加以限制,在定义包规范时,可以使用纯度级别(purity level)限制公用函数
语法:pragmarestrict_references (function_name,wnds[,wnps][,rnds][,rnps]);
wnds:用于限制函数不能修改数据库数据(禁止DML)
wnps:用于限制函数不能修改包变量(不能给包变量赋值)
rnds:用于限制函数不能读取数据库数据(禁止SELECT操作)
rnps:用于限制函数不能读取包变量(不能将包变量赋值给其他变量)
1.建立包规范
create or replacepackage purity is
minsalnumber(6,2);
maxsalnumber(6,2);
functionmax_sal return number;
functionmin_sal return number;
pragmarestrict_references(max_sal,wnps);--不能修改
pragmarestrict_references(min_sal,wnps);
end;
2.建立包体
create or replacepackage body purity is
function max_sal return number
is
begin
return maxsal;
end;
functionmin_sal return number
is
begin
return minsal;
end;
begin
select min(sal),max(sal) into minsal,maxsal from emp;
end;
3.调用包的公用函数
var minsal number
var maxsal number
exec :minsal:=purity.minsal()
exec :maxsal:=purity.maxsal()
print minsal maxsal PL/SQL处理异常不同于其他程序语言的错误管理方法,PL/SQL的异常处理机制与ADA很相似,有一个处理错误的全包含方法。
PL/SQL处理异常不同于其他程序语言的错误管理方法,PL/SQL的异常处理机制与ADA很相似,有一个处理错误的全包含方法。当发生错误时,程序无条件转到异常处理部分,这就要求代码要非常干净并把错误处理部分和程序的其它部分分开。oracle允许声明其他异常条件类型以扩展错误/异常处理。这种扩展使PL/SQL的异常处理非常灵活。
当一个运行时错误发生时,称为一个异常被抛出。PL/SQL程序编译时的错误不是能被处理得异常,只有在运行时的异常能被处理。在PL/SQL程序设计中异常的抛出和处理是非常重要的内容。

㈥ postgresql数据库 命令导入表不成功

开始觉得这个导入是个比较简单的事情,经过测试你的这个,发现还不简单。

经过尝试,发现在导入时,需要在cvs文件中加入导入字段的定义,即第一行需要有字段名,然后在命令中要指定选项header为true.另外,为了保证成功,还加入format指定为csv,文件格式指定为utf8。

我的导入命令:

aa_log(id,callid,calledid)
from'e: 01.csv'
with(formatcsv,headertrue,quote'"',DELIMITER',',encoding'UTF8');

导入文件内容:

id,callid,calledid
1,2,3
4,5,6

导入结果如下图,

㈦ PL/SQL基础的过程

存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUTE命令或PL/SQL程序块内部调用,定义存储过程的语法如下:
PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]

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

1.初始化外部函数
就是说明包含外部函数的动态链接库的位置,并从中分离出外部函数的原型,并将外部函数中主语言的数据类型和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中ProcereBuilder帮助文件中对ORA_FFI软件包的详细介绍。

㈨ 在PL/SQL 中请教一个SQL语句怎么写

使用游标打开的方式。
create
or
replace
procere
BOB_TABLEVAR_TEST(
Z_TABLE_NAME
IN
VARCHAR2,
Z_RESULTCOUNT
IN
OUT
NUMBER)
is
TYPE
RefCurTyp
IS
REF
CURSOR;
crtest
RefCurTyp;
begin
open
crtest
for
'select
count(*)
as
total
from
'||Z_TABLE_NAME
;
fetch
crtest
into
Z_RESULTCOUNT;
end
BOB_TABLEVAR_TEST;
请采纳答案,支持我一下。

㈩ orcale..in out inout用法

in 表示p_parameter是输入参数,就是运行过程前,要你输入
out 表示输出参数 就是运行过程后,显示出来的结果,PLSQL中会用黄色标出
in out 就是输入输出参数,就是运行过程前,要你输入,运行过程后,显示出来的最终的这个参数的值