比如说传入一个 record 该如何定义? 调用? 

解决方案 »

  1.   

    可以用package来封装一个复合类型变量,然后跟普通变量一样作入参,本质上是一样的。。
      

  2.   


    哦, 我现在疑问的是: 如果我定义了一个 record 
    type emp_record is record (
           ename emp.ename%type,
           eno emp.empno%type  
      );
     然后 我定义一个 存储过程create or replace procedure pro_add_emp(v_emp_rcd in out emp_record)is
    begin
           dbms_output.put_line(v_emp_rcd.ename);
    end pro_add_emp;
    编译的时候会报错, 必须声明标识符 emp_record请问我该如何解决这个问题呢????
      

  3.   


    --给你个例子,用package做的,其实是一样的Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - Production--创建包,包中有一个record的类型
    SQL> create or replace package pag_record IS
      2   --定义record类型
      3   type emp_record is record (
      4     ename emp.ename%type,
      5     eno emp.empno%type
      6     );
      7   rs emp_record;--定义类型变量
      8   end;
      9  /Package created.--创建过程,入参为:pag_record.emp_record
    SQL> create or replace procedure pro_add_emp(v_emp_rcd in pag_record.emp_record)
      2   is
      3   begin
      4     dbms_output.put_line(v_emp_rcd.ename);
      5   end pro_add_emp;
      6  /Procedure created.SQL> set serveroutput on
    --调用过程:
    SQL> DECLARE
      2   rs pag_record.emp_record;
      3   BEGIN
      4     SELECT ename,empno INTO rs FROM emp where ROWNUM=1;
      5     pro_add_emp(rs);
      6   END; 
      7  /
    SMITHPL/SQL procedure successfully completed.SQL> 
      

  4.   


    学习了, 请问一下 ,emp_record   如果不放在package中 是不是就没有办法实现了?还是可以有其他办法??
      

  5.   


    如果你存储过程入参要用到你定义的record,且此过程是单独创建的,那么必须用package包装record,然后再过程中用另外还有个方法就是,一个包里面定义一个record,并且此包中有自己定义的一个存储过程,也就是说,如我上面例子所示,可以将pro_add_emp此过程放到pag_record中
      

  6.   

    另外 , 请教一下 如何在java 中 用JDBC 调用这个
    pro_add_emp(v_emp_rcd in pag_record.emp_record)  ?呵呵 , 冒昧了,不知道你是不是搞java的
      

  7.   

    SQL> CREATE OR REPLACE TYPE emp_record is object(ename varchar2(10), eno number(4) )
      2  /
     
    Type createdSQL> create or replace procedure pro_add_emp(v_emp_rcd in out emp_record)
      2  
      3  is
      4  begin
      5    dbms_output.put_line(v_emp_rcd.ename);
      6  end ;
      7  /
     
    Procedure created
      
    SQL> declare
      2  v_v emp_record;
      3  begin
      4  v_v:=emp_record('test',123);
      5  pro_add_emp(v_v);
      6  dbms_output.put_line(v_v.eno||':'||v_v.ename);
      7  end;
      8  /
     
    test
    123:test
     
    PL/SQL procedure successfully completed
     
    SQL>
    前台程序怎么调用不清楚.