C# 执行Sql语句一些基本错误:C# 操作Oracle数据库遇到的一些问题与解决方案,ORA-00936,ORA-01861,OracleParameter 错误


Oracle 创建存储过程要注意事项:

        创建用户一定不要使用SYSDBASYSOPER,如果使用这两种方式进行连接。如果使用这两种方式连接创建的存储过程就不属于当前用户从而导致当前用户找不到存储过程。错误:(PLS-00201: 必须声明标识符 'EMP_INSERT')

            

6362526946170422532827091.png


        创建存储过程语法:

create or replace procedure 存储过程名(param1 in type,param2 out type) 
as 
变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
 
    If (判断条件) then
       Select 列名 into 变量2 from 表A where列名=param1;
       Dbms_output。Put_line(‘打印信息’);
    Elsif (判断条件) then
       Dbms_output。Put_line(‘打印信息’);
    Else
       Raise 异常名(NO_DATA_FOUND);
    End if;
Exception
    When others then
       Rollback;
End;

    实际创建

create or replace procedure emp_insert(empno in NUMBER,ename in VARCHAR2,job in VARCHAR2,mgr in NUMBER,hiredate in VARCHAR2,sal in NUMBER,comm in NUMBER,deptno in Number)
as
begin
  insert into scott.emp (empno,ename,job,mgr,hiredate,sal,comm,deptno) values (empno,ename,job,mgr,to_date(hiredate,'dd-mm-yyyy'),sal,comm,deptno);
end;

注意事项:

1, 存储过程参数不带取值范围,in表示传入,out表示输出

类型可以使用任意Oracle中的合法类型。

2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4,  用select 。。。into。。。给变量赋值

5,  在代码中抛异常用 raise+异常名


C#执行Oracle存储过程

public int InsertByProcedure(Emp emp)
        {
            string str = "emp_insert";
            
            OracleParameter[] parameter = {
                new OracleParameter("empno",emp.EmpNo),
                new OracleParameter("ename",emp.Ename),
                new OracleParameter("job",emp.Job),
                new OracleParameter("mgr",emp.Mgr),
                new OracleParameter("hiredate",emp.HireDate.ToString("dd-MM-yyyy")),
                new OracleParameter("sal",emp.Sal),
                new OracleParameter("comm",emp.Comm),
                new OracleParameter("deptno",emp.Deptno),
            };
            int rows = OracleHelper.ExecuteNonQuery(connectionString, System.Data.CommandType.StoredProcedure, str, parameter);

            return rows;
        }