create or replace procedure sp_test1
(
DWMC in VARCHAR2,
LX in VARCHAR2
)
IS
v_sql VARCHAR2(1000);
begin
v_sql := 'select * from test_table where dwmc:='+DWMC+' and lx:='+LX+'';
execute immediate v_sql;
end sp_test1;
我这样写的有问题,据说要游标还要包什么的,为什么?
谁给我写一下,最好加注释让我明白为什么这样写!
(
DWMC in VARCHAR2,
LX in VARCHAR2
)
IS
v_sql VARCHAR2(1000);
begin
v_sql := 'select * from test_table where dwmc:='+DWMC+' and lx:='+LX+'';
execute immediate v_sql;
end sp_test1;
我这样写的有问题,据说要游标还要包什么的,为什么?
谁给我写一下,最好加注释让我明白为什么这样写!
解决方案 »
- 关于oracle水位线问题
- JSP连接ORACLE数据库的问题
- Oracle 10g(32位)下备份的数据库能否还原到Oracle 10g(64位)的数据库中.
- 痛苦的选择: 我有一个大型中文数据库, 现在需要增加英文版, 因此数据库面临分家的问题? 黑头想成了白头?
- 可以在表上加触发器来记录哪个ip哪个用户 删除这个表的记录吗?
- 想深入沟通Oracle、Java技术吗?请大家到这里(www.OracleBBS.com)来一起讨论!我们将实时在线讨论和解答。
- 关于大数据量的插入性能问题
- 请问上海软件公司程序员的工资有多少??
- 100分求一简单语句
- Oracle中引入外部的Java类的问题!!!
- 谁能给我详细解释一下SQL的关联加号(+)?
- 将一个表中的数据插入到另一个表中,两个表的结构一样,问sql文怎么写?谢谢!
--声明包头
CREATE OR REPLACE PACKAGE PACK_TEST
AS
--这个是游标
TYPE TESTCUR IS REF CURSOR;
--这个是过程
PROCEDURE sp_test1(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR);
END PACK_TEST;
--声明包体
CREATE OR REPLACE PACKAGE BODY PACK_TEST
AS
PROCEDURE sp_test1(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR) is
strsql varchar2(1000);
begin
strsql:='select * from test_table where dwmc='':dwmc'' and lx='':lx''';
open p_cur for strsql using dwdc,lx;--上一句的:及这一句为绑定变量
end sp_test1;
end PACK_TEST;
1、先要定义游标
2、游标在包头里进行定义
3、游标在包体里使用
4、strsql:='select * from test_table where dwmc='':dwmc'' and lx='':lx''';里的''是否代表一个'呢?
5、我把这句放到pl/sql里的sql window执行成功,然后在package里发现PACK_TEST上有个小红叉,在PROCEDURE里没有发现sp_test1是怎么回事
答:对!被单引号括起来的字符串中2个''才代表一个'。
5.我把这句放到pl/sql里的sql window执行成功,然后在package里发现PACK_TEST上有个小红叉,在PROCEDURE里没有发现sp_test1是怎么回事
答:这个是我简单写的一个例子,没有经过调试~你右键选择PACK_TEST,点击编辑或者测试,他会有报错信息~你可以自己调试一下
Compilation errors for PACKAGE PG.PACK_TESTError: PLS-00103: 出现符号 "CREATE"
Line: 10
Text: CREATE OR REPLACE PACKAGE BODY PACK_TEST
过程的sp_test1的输出 是个游标
CREATE OR REPLACE PACKAGE PACK_TEST
AS
--这个是游标
TYPE TESTCUR IS REF CURSOR;
--这个是过程
PROCEDURE sp_test1(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR);
END PACK_TEST; //这是结束 PACK_TESTCREATE OR REPLACE PACKAGE BODY PACK_TEST
AS
PROCEDURE sp_test1(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR) is
strsql varchar2(1000);
begin
strsql:='select * from test_table where dwmc='':dwmc'' and lx='':lx''';
open p_cur for strsql using dwdc,lx;--上一句的:及这一句为绑定变量
end sp_test1; //过程结束end PACK_TEST;//结束PACK_TEST为什么要两交结束PACK_TEST
我把package和package body分成2段分别执行,执行成功了。
可是我该在pl/sql中如何执行sp_test1这个存储?在procedures列表中没有找到sp_test1这个存储。
在package body中找到了PACK_TEST包体,view打开,在program window左边窗口中找到了sp_test1,我在上面右键选择了test(我想这是不是测试存储过程的,像sqlserver一样),然后弹出了test window,test window下方是2个传入变量和一个传出的游标,在Value列这里输入了值f8执行最后提示:ORA-01006:赋值变量不存在错误
你要想一步步跟进去测试包中的过程的话,再写个简单的过程,里面调包里的过程,如:
CREATE OR REPLACE PROCEDURE test(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR) IS
BEGIN
EXECUTE IMMEDIATE 'CALL PACK_TEST.sp_test1(''' || DWMC ||
''',''' || LX || ''',P_CUR)';
end;
你测试的方法正确。代码有点错,改成这样因该就没问题了--声明包头
CREATE OR REPLACE PACKAGE PACK_TEST
AS
--这个是游标
TYPE TESTCUR IS REF CURSOR;
--这个是过程
PROCEDURE sp_test1(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR);
END PACK_TEST;
--声明包体
CREATE OR REPLACE PACKAGE BODY PACK_TEST
AS
PROCEDURE sp_test1(DWMC in VARCHAR2, LX in VARCHAR2,
P_CUR OUT TESTCUR) is
strsql varchar2(1000);
begin
strsql:='select * from test_table where dwmc=:dwmc and lx=:lx';
open p_cur for strsql using dwdc,lx;--上一句的:及这一句为绑定变量
end sp_test1;
end PACK_TEST;
楼上的学会了吗?为何我按照yf520gn 老兄的步骤编译包后,执行时出错的?
SQL> exec PACK_TEST.sp_test1('TEST01','USERS');
begin PACK_TEST.sp_test1('TEST01','USERS'); end;
ORA-06550: 第 2 行, 第 7 列:
PLS-00306: wrong number or types of arguments in call to 'SP_TEST1'
ORA-06550: 第 2 行, 第 7 列:
PL/SQL: Statement ignored
open p_cur for strsql using dwdc,lx;--上一句的:及这一句为绑定变量
其实可以不用创建这个变量strsql的,直接将后面的sql语句写在open 后面open p_cur for
select * from test_table
where dwmc=dwmc and lx=lx;
end;