1 查验存储过程的所有者
创建存储过程的时候 注意下存储过程的ower是谁
如果是已经创建好的存储过程,需要给相应的用户赋权限
可以在 命令行中通过sqlplus 登录管理员sysdba,
执行 grant execute on Proc ** to UserName;
--第一个存储过程 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();
}
对于出现存储过程识别不了的问题,需要查看连接的数据库,权限是否正确,权限出问题的可能性很大。
创建存储过程的时候 注意下存储过程的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: 必须声明标识符 "的错误。对于出现存储过程识别不了的问题,需要查看连接的数据库,权限是否正确,权限出问题的可能性很大。