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;
我这样写的有问题,据说要游标还要包什么的,为什么?
谁给我写一下,最好加注释让我明白为什么这样写!

解决方案 »

  1.   


    --声明包头
    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;
     
      

  2.   

    还有ORACLE里面的字符连接不用+要用||
      

  3.   

    打开游标那一句的DWMC打成DWDC了~自己改一下
      

  4.   

    大致明白了,要返回结果集:
    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是怎么回事
      

  5.   

    4、strsql:='select * from test_table where dwmc='':dwmc'' and lx='':lx''';里的''是否代表一个'呢? 
    答:对!被单引号括起来的字符串中2个''才代表一个'。
    5.我把这句放到pl/sql里的sql window执行成功,然后在package里发现PACK_TEST上有个小红叉,在PROCEDURE里没有发现sp_test1是怎么回事 
    答:这个是我简单写的一个例子,没有经过调试~你右键选择PACK_TEST,点击编辑或者测试,他会有报错信息~你可以自己调试一下
      

  6.   

    出现这个错误:
    Compilation errors for PACKAGE PG.PACK_TESTError: PLS-00103: 出现符号 "CREATE"
    Line: 10
    Text: CREATE OR REPLACE PACKAGE BODY PACK_TEST
      

  7.   

    P_CUR OUT TESTCUR  --这里的TESTCUR  是引用 TYPE TESTCUR IS REF CURSOR;的的吗
    过程的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
      

  8.   

    我是楼主
    我把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:赋值变量不存在错误
      

  9.   


    你要想一步步跟进去测试包中的过程的话,再写个简单的过程,里面调包里的过程,如:
    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;
      

  10.   

    是我没说清楚,创建包头和包体是分开创建的~
    你测试的方法正确。代码有点错,改成这样因该就没问题了--声明包头
    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;
      

  11.   


    楼上的学会了吗?为何我按照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
      

  12.   

    strsql:='select * from test_table where dwmc=:dwmc and lx=:lx';
    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;