oracle存储过程小计

1 查验存储过程的所有者
    创建存储过程的时候 注意下存储过程的ower是谁
    如果是已经创建好的存储过程,需要给相应的用户赋权限
    可以在 命令行中通过sqlplus 登录管理员sysdba,
    执行 grant execute on Proc **  to UserName;

    将相应的存储过程权限赋

给用户2 创建带参有出参的存储过程。

    
--第一个存储过程 bcb调用
CREATE OR REPLACE PROCEDURE USP_RISREPORT_UPLOAD
(
P_ID     IN     varchar,   --检验结果对应id   
P_KHMZH  IN varchar,  --卡号   
X_SUCCESS    OUT  varchar,--返回是否成功:0否;1是
X_MESSSAGE   OUT    varchar --返回保存失败的错误信息
)
AS
BEGIN
    X_SUCCESS := 0;
    X_MESSSAGE  :='err';
   SELECT X_SUCCESS,X_MESSSAGE INTO X_SUCCESS ,X_MESSSAGE FROM  DUAL; END;




--第二个存储过程 c#调用
CREATE OR REPLACE PROCEDURE Test123(P_RequisitionID IN varchar,
                                    X_SUCCESS       OUT varchar --返回信息         
                                    ) AS
  tPATIENTTYPEID VARCHAR(1);
  tPATIENTID     VARCHAR(32);
  used           int;

BEGIN
  select PATIENTID, PATIENTTYPEID
    INTO tPATIENTID, tPATIENTTYPEID
    from RIS_REQUEST
   WHERE REQUISITIONID = P_RequisitionID;

  used := 0; --  0 门诊住院病理不分离  1 分离

  if (used = 0) then
 
    X_SUCCESS := 'http://192.168.53.58:8080/HospitalInfoPlatform/emrViewer.html?kh=' ||tPATIENTID || '&klx=9';
 
  elsif (used = 1) then
    IF (tPATIENTID IS NOT NULL) THEN
      IF (tPATIENTTYPEID = '0') THEN
        X_SUCCESS := 'http://192.168.53.58:8080/HospitalInfoPlatform/emrViewer.html?kh=' || tPATIENTID || '&klx=9';
      elsif (tPATIENTTYPEID = '1') then
        X_SUCCESS := 'http://192.168.53.58:8080/HospitalInfoPlatform/emrViewer.html?kh=123321&klx=9';
      end IF;
    end IF;
 
  end IF;

 --  dbms_output.put_line(X_SUCCESS);--调试

EXCEPTION
  WHEN NO_DATA_FOUND THEN
 
    X_SUCCESS := '没有成功';
    DBMS_OUTPUT.PUT_LINE('没有数据');
 
END;
 


3 程序调用存储过程
--Bcb 调用
  if(sp1->Active)
        sp1->Close();
        sp1->ProcedureName="Test123";
        sp1->Parameters->Clear();
        sp1->Parameters->CreateParameter("P_RequisitionID",ftString,pdInput,16,NULL);
        sp1->Parameters->CreateParameter("X_SUCCESS", ftString,pdOutput, 300, NULL);
        sp1->Parameters->ParamByName("P_RequisitionID")->Value= edtRisUniqueNo->Text.Trim();
        sp1->ExecProc();
        AnsiString return_value = sp1->Parameters->ParamByName("X_SUCCESS")->Value;

注: sp1为TADOStoredProc控件

--c# 调用
string constr = System.Configuration.ConfigurationManager.AppSettings["DbConnString"];
using (OracleConnection con = new OracleConnection(constr))
{
        con.Open();
        OracleCommand cmd = new OracleCommand("usp_risreport_upload", con);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.Add(new OracleParameter("P_ID", Requisitionid));
        cmd.Parameters.Add(new OracleParameter("P_KHMZH", CardNo));
        cmd.Parameters.Add(new OracleParameter("X_SUCCESS", OracleType.VarChar, 4000)).Direction = ParameterDirection.Output;
        cmd.Parameters.Add(new OracleParameter("X_MESSSAGE", OracleType.VarChar, 4000)).Direction = ParameterDirection.Output; ;
        cmd.ExecuteNonQuery();
        X_SUCCESS = cmd.Parameters["X_SUCCESS"].Value.ToString();
        X_MESSSAGE = cmd.Parameters["X_MESSSAGE"].Value.ToString();
}

注:

1>CreateParameter 方法可用指定的名称、类型、方向、大小和值创建新的 Parameter 对象。在参数中传送的所有值都将写入相应的 Parameter 属性

2>在调用的时候出现 "Oracle 存储过程错误之PLS-00201: 必须声明标识符 "的错误。
对于出现存储过程识别不了的问题,需要查看连接的数据库,权限是否正确,权限出问题的可能性很大。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值