在ORACLE @id int,@name out varchar(10),不需要@的.一般定义就可以了.在DELPHI就用STROREPROC控件就可以或用ADO就可以报.

解决方案 »

  1.   

    create or replace procedure (
          id     in    int,
          name out varchar2) is
    begin
         select xxx into name 
         from table_name
         where oid = id;
    end;
      

  2.   

    --创建登录的存储过程
    create or replace package package_login is
    type outLine is ref cursor;
    procedure login(pUserName in varchar2, pPwd in varchar2,result out outLine);
    end package_login;
    /create or replace package body package_login
    is
    procedure login(pUserName in varchar2, pPwd in varchar2,result out outLine)
    is
    begin
    open result
    for
    select userID,userName
    from usersTable
    where userName=pUserName and pwd=pPwd;
    end;
    end package_login;
    /
    java调用存储过程代码如下:
    public class Login {
      private Connection conn = null;
      private ResultSet rs = null;
     
      private OracleCallableStatement csmt;  public UserForm login(LoginForm loginBean) throws Exception {
        UserForm userForm = null;
        try {
          DBConnection comConn = new DBConnection();
          conn = comConn.getConnection();
          conn.setAutoCommit(false);
          csmt = (OracleCallableStatement)conn.prepareCall("{call package_login.login(?,?,?)}");
          csmt.setString(1, loginBean.getUsername());
          csmt.setString(2, loginBean.getPwd());
          csmt.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);
          csmt.executeQuery();
          rs =csmt.getCursor(3);
          userForm = new UserForm();
            while (rs.next()) {
              System.out.println(rs.getInt(1));
              System.out.println(rs.getString(2));
              userForm.setUserID(rs.getInt(1));
              userForm.setUserName(rs.getString("userName"));
            }
          conn.commit();
          rs.close();
          csmt.close();
          conn.setAutoCommit(true);
          comConn.returnConnection(conn);
        }    catch (Exception ex) {
          ex.printStackTrace();
          conn.rollback();
        }
        return userForm;
      }}
      

  3.   

    同意楼上的啊,而且在sql*plus中可以直接调用啊
    如:
    declare
    abc varchar2(50);
    begin
    PROC SP_1('定义的参数1','定义的参数2');
    dbms_output.put_line('输出参数定义的abc');-----在PL/SQL中的返回显示啊,而且事先                                     -----set serveroutput on
    end;
      

  4.   

    接着问vb/vba怎么调用带有返回游标参数的存储过程?因为给adodb.command对象加参数的时候要输入参数类型的,而vb好像没有OracleTypes.CURSOR 之类的参数类型吧?
      

  5.   

    用存储过程返回数据集的话,需要用到Ref游标(游标变量).好象CSDN以前有这方面的资料,可以查查.调用储存过程时有两种方式,一种是按位置来传递参数,另一种就是写上参数名和参数值来调用,我觉得这两种调用方式都和SQL server的差不多