Sql Oracle中的存储函数未将值插入所需表

Sql Oracle中的存储函数未将值插入所需表,sql,oracle,function,Sql,Oracle,Function,下面是我的代码。我正在尝试添加5个参数,函数会将这些参数放入Employee表中。但我没有成功地做到这一点,我已经尝试了很多事情 错误 ORA-01858:在指定数字的位置找到非数字字符 预期ORA-06512:“xxxxxxx.A1SF_附录”第14行 185800000-“在需要数字的位置找到非数字字符” *原因:使用日期格式模型转换的输入数据无效 不对。输入数据不包含数字所在的数字 格式模型所要求的。 *操作:修复输入数据或日期格式模型,以确保 元素的数量和类型匹配。然后重试该操作 另外,

下面是我的代码。我正在尝试添加5个参数,函数会将这些参数放入Employee表中。但我没有成功地做到这一点,我已经尝试了很多事情

错误

ORA-01858:在指定数字的位置找到非数字字符 预期ORA-06512:“xxxxxxx.A1SF_附录”第14行 185800000-“在需要数字的位置找到非数字字符” *原因:使用日期格式模型转换的输入数据无效 不对。输入数据不包含数字所在的数字 格式模型所要求的。 *操作:修复输入数据或日期格式模型,以确保 元素的数量和类型匹配。然后重试该操作

另外,如何测试包含Insert/Update或Delete语句的存储函数

执行语句

Select A1SF_ADDEMP('Adesh', '33', 'M', 8000, '26/03/1990')
From dual;
代码

CREATE OR REPLACE Function A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        ) Return Varchar2
        Is
          tEmpId Number(38,0);
          tBirthDate Date;

        BEGIN
              tEmpId := A1Seq_Emp.nextval;
              tBirthdate := to_date('pBirthdate','dd/mm/yyyy');

               Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
                Values (tEmpId, pEmpName, pTaxFileNo, pGender, pSalary, tBirthdate);                 
                Commit;
                Return null;
        END;

如果不返回任何值,则应使用过程(而不是函数)

如果查看错误消息中提到的行,您可以发现错误:

tBirthdate := to_date('pBirthdate','dd/mm/yyyy');
您正在将字符串文字“pBirthdate”传递给to_date()调用。但是您想要传递参数,所以它应该是

tBirthdate := to_date(pBirthdate,'dd/mm/yyyy');
(请注意pBirthdate周围缺少的单引号)

因此,作为一个程序,整个过程看起来是这样的:

CREATE OR REPLACE PROCEDURE A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        )
IS 
BEGIN
   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values (A1Seq_Emp.nextval, pEmpName, pTaxFileNo, pGender, pSalary, to_date(pBirthdate,'dd/mm/yyyy'));
   Commit;

END;
create or replace procedure A1SF_ADDEMP (
          pEmpName in varchar2
        , pTaxFileNo in varchar2
        , pGender in varchar2
        , pSalary in number
        , pBirthdate in varchar2
        , pEmpid out number
          ) return varchar2 is

begin

   pempid := A1Seq_Emp.nextval;

   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values ( pEmpId, pEmpName, pTaxFileNo, pGender
          , pSalary, to_date(pBirthdate,'dd/mm/yyyy');     

end;
begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;
declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;
要运行它,请执行以下操作:

execute A1SF_ADDEMP('Adesh', '33', 'M', 8000, '26/03/1990');

如果不返回任何值,则应使用过程(而不是函数)

如果查看错误消息中提到的行,您可以发现错误:

tBirthdate := to_date('pBirthdate','dd/mm/yyyy');
您正在将字符串文字“pBirthdate”传递给to_date()调用。但是您想要传递参数,所以它应该是

tBirthdate := to_date(pBirthdate,'dd/mm/yyyy');
(请注意pBirthdate周围缺少的单引号)

因此,作为一个程序,整个过程看起来是这样的:

CREATE OR REPLACE PROCEDURE A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        )
IS 
BEGIN
   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values (A1Seq_Emp.nextval, pEmpName, pTaxFileNo, pGender, pSalary, to_date(pBirthdate,'dd/mm/yyyy'));
   Commit;

END;
create or replace procedure A1SF_ADDEMP (
          pEmpName in varchar2
        , pTaxFileNo in varchar2
        , pGender in varchar2
        , pSalary in number
        , pBirthdate in varchar2
        , pEmpid out number
          ) return varchar2 is

begin

   pempid := A1Seq_Emp.nextval;

   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values ( pEmpId, pEmpName, pTaxFileNo, pGender
          , pSalary, to_date(pBirthdate,'dd/mm/yyyy');     

end;
begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;
declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;
要运行它,请执行以下操作:

execute A1SF_ADDEMP('Adesh', '33', 'M', 8000, '26/03/1990');

首先,不能在select语句中调用函数。必须将输出分配给PL/SQL块中的变量,类似于:

declare
  l_output number;
begin
  l_output := my_function(variable1, variable2);
end;
在函数中使用DML是不好的做法;部分原因是它会导致你遇到的错误。您应该使用下面详述的程序。另一个原因是您总是返回null,根本不需要返回任何东西

create or replace procedure my_procedure ( <variables> ) is
begin

   insert into employees( <columns> )
   values ( <values > );

end;
要执行该过程,请按如下方式调用它:

CREATE OR REPLACE PROCEDURE A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        )
IS 
BEGIN
   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values (A1Seq_Emp.nextval, pEmpName, pTaxFileNo, pGender, pSalary, to_date(pBirthdate,'dd/mm/yyyy'));
   Commit;

END;
create or replace procedure A1SF_ADDEMP (
          pEmpName in varchar2
        , pTaxFileNo in varchar2
        , pGender in varchar2
        , pSalary in number
        , pBirthdate in varchar2
        , pEmpid out number
          ) return varchar2 is

begin

   pempid := A1Seq_Emp.nextval;

   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values ( pEmpId, pEmpName, pTaxFileNo, pGender
          , pSalary, to_date(pBirthdate,'dd/mm/yyyy');     

end;
begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;
declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;
如果要返回
empid
,可以这样调用它:

CREATE OR REPLACE PROCEDURE A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        )
IS 
BEGIN
   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values (A1Seq_Emp.nextval, pEmpName, pTaxFileNo, pGender, pSalary, to_date(pBirthdate,'dd/mm/yyyy'));
   Commit;

END;
create or replace procedure A1SF_ADDEMP (
          pEmpName in varchar2
        , pTaxFileNo in varchar2
        , pGender in varchar2
        , pSalary in number
        , pBirthdate in varchar2
        , pEmpid out number
          ) return varchar2 is

begin

   pempid := A1Seq_Emp.nextval;

   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values ( pEmpId, pEmpName, pTaxFileNo, pGender
          , pSalary, to_date(pBirthdate,'dd/mm/yyyy');     

end;
begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;
declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;
请注意我是如何将
commit
移动到最高级别的,这是为了避免在您可能需要做更多事情时在每个过程中提交内容


顺便说一句,如果您使用的是Oracle 11g,则无需将值
A1Seq_Emp.nextval
分配给变量。您可以直接将其插入
值列表中的表中。当然,您不能返回它,但您可以返回,只要没有其他东西可以从序列中获取值。

首先,您不能在select语句中调用函数。必须将输出分配给PL/SQL块中的变量,类似于:

declare
  l_output number;
begin
  l_output := my_function(variable1, variable2);
end;
在函数中使用DML是不好的做法;部分原因是它会导致你遇到的错误。您应该使用下面详述的程序。另一个原因是您总是返回null,根本不需要返回任何东西

create or replace procedure my_procedure ( <variables> ) is
begin

   insert into employees( <columns> )
   values ( <values > );

end;
要执行该过程,请按如下方式调用它:

CREATE OR REPLACE PROCEDURE A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        )
IS 
BEGIN
   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values (A1Seq_Emp.nextval, pEmpName, pTaxFileNo, pGender, pSalary, to_date(pBirthdate,'dd/mm/yyyy'));
   Commit;

END;
create or replace procedure A1SF_ADDEMP (
          pEmpName in varchar2
        , pTaxFileNo in varchar2
        , pGender in varchar2
        , pSalary in number
        , pBirthdate in varchar2
        , pEmpid out number
          ) return varchar2 is

begin

   pempid := A1Seq_Emp.nextval;

   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values ( pEmpId, pEmpName, pTaxFileNo, pGender
          , pSalary, to_date(pBirthdate,'dd/mm/yyyy');     

end;
begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;
declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;
如果要返回
empid
,可以这样调用它:

CREATE OR REPLACE PROCEDURE A1SF_ADDEMP
        (pEmpName In Varchar2,
        pTaxFileNo In Varchar2,
        pGender In Varchar2,
        pSalary In Number,
        pBirthdate In Varchar2
        )
IS 
BEGIN
   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values (A1Seq_Emp.nextval, pEmpName, pTaxFileNo, pGender, pSalary, to_date(pBirthdate,'dd/mm/yyyy'));
   Commit;

END;
create or replace procedure A1SF_ADDEMP (
          pEmpName in varchar2
        , pTaxFileNo in varchar2
        , pGender in varchar2
        , pSalary in number
        , pBirthdate in varchar2
        , pEmpid out number
          ) return varchar2 is

begin

   pempid := A1Seq_Emp.nextval;

   Insert Into Employee(EmpId, EmpName, TaxFileNo, Gender, Salary, Birthdate)
   Values ( pEmpId, pEmpName, pTaxFileNo, pGender
          , pSalary, to_date(pBirthdate,'dd/mm/yyyy');     

end;
begin

    A1SF_ADDEMP( EmpName, TaxFileNo, Gender
               , Salary, Birthdate);
    commit;

end;
declare

   l_empid number;

begin

   l_empid := A1SF_ADDEMP( EmpName, TaxFileNo, Gender
                         , Salary, Birthdate);
   commit;
end;
请注意我是如何将
commit
移动到最高级别的,这是为了避免在您可能需要做更多事情时在每个过程中提交内容


顺便说一句,如果您使用的是Oracle 11g,则无需将值
A1Seq_Emp.nextval
分配给变量。您可以直接将其插入
值列表中的表中。当然,您不能返回它,但您可以返回,只要没有其他东西可以从序列中获取值。

在您的情况下,您需要使用带有out参数的过程,其中out参数是包含所需值的返回参数。我认为这是在select语句中使用DML时在这种情况下的最佳实践

第二种方法是使用一个类似于您的函数,但这不是一个好的做法,但在返回值之前,您需要使用if语句检查值是什么,以及if值是您希望在if语句PRAGMA autonomy_事务过程中调用的值,它将独立于对它的函数调用来执行DML。有关pragma事务的更多信息,请阅读:


向您致意,并希望我对您有所帮助

在您的情况下,您需要使用带有out参数的过程,其中out参数是包含所需值的返回参数。我认为这是在select语句中使用DML时在这种情况下的最佳实践

第二种方法是使用一个类似于您的函数,但这不是一个好的做法,但在返回值之前,您需要使用if语句检查值是什么,以及if值是您希望在if语句PRAGMA autonomy_事务过程中调用的值,它将独立于对它的函数调用来执行DML。有关pragma事务的更多信息,请阅读:


致以最诚挚的问候,并希望我能有所帮助

不能这样执行。从命令中第22行开始的错误:执行A1SF_ADDEMP('Adesh','33','M',8000',26/03/1990')错误报告:ORA-06550:第1行第7列:PLS-00221:'A1SF_ADDEMP'不是过程或未定义ORA-06550:第1行第7列:PL/SQL:语句忽略06550。00000-“行%s,列%s:\n%s”*原因:通常是PL/SQL编译错误*措施:此错误何时发生?当您运行CREATE语句或