Oracle 为什么要获取ORA-01858:在需要数字的位置找到非数字字符?

Oracle 为什么要获取ORA-01858:在需要数字的位置找到非数字字符?,oracle,plsql,Oracle,Plsql,我正在使用xml表。我的日期类型列有问题。有没有人能检查一下我的代码,告诉我我的代码有什么问题,因为我无法找出它 我的表格TBL\u EMP\u BASIC\u PROFILE是: Name Null Type --------------------- -------- ------------- EBASP_ID NOT NULL VARCHAR2(10) EBASP_NAME

我正在使用xml表。我的日期类型列有问题。有没有人能检查一下我的代码,告诉我我的代码有什么问题,因为我无法找出它

我的表格
TBL\u EMP\u BASIC\u PROFILE
是:

Name                  Null     Type          
--------------------- -------- ------------- 
EBASP_ID              NOT NULL VARCHAR2(10)  
EBASP_NAME                     VARCHAR2(50)  
B_EBASP_NAME                   VARCHAR2(150) 
EBASP_GENDER                   VARCHAR2(8)   
EBASP_CATEGORY                 VARCHAR2(10)  
EBASP_REGION_TYPE              VARCHAR2(20)  
EBASP_REGION_NAME              VARCHAR2(50)  
EBASP_SUB_REGION               VARCHAR2(50)  
EBASP_LOCATION                 VARCHAR2(100) 
EBASP_DESIGNATION              VARCHAR2(50)  
B_EBASP_DESIGNATION            VARCHAR2(150) 
EBASP_DATE_OF_JOINING          DATE          
EBASP_GRADE                    NUMBER(2)     
EBASP_BASIC                    NUMBER(7)     
EBASP_PHOTO_UPLOAD             VARCHAR2(500) 
EBASP_CREATED_ON               DATE          
EBASP_CREATED_BY               VARCHAR2(10)  
我的软件包功能是:

FUNCTION save_emp_basic_profile(employeeData VARCHAR2) RETURN CLOB IS

ret CLOB;
xmlData XMLType;
v_code NUMBER;
v_errm VARCHAR2(500);

BEGIN

xmlData:=XMLType(employeeData);
INSERT INTO TBL_EMP_BASIC_PROFILE SELECT temp1.* FROM XMLTABLE('/employees/employee'
                                  PASSING xmlData
                                  COLUMNS ebasp_id VARCHAR2(10) PATH 'ebasp_id',
                                          ebasp_name VARCHAR2(50) PATH 'ebasp_name',
                                          b_ebasp_name VARCHAR2(150) PATH 'b_ebasp_name',
                                          ebasp_gender VARCHAR2(8) PATH 'ebasp_gender',
                                          ebasp_category VARCHAR2(10) PATH 'ebasp_category',
                                          ebasp_region_type VARCHAR2(50) PATH 'ebasp_region_type',
                                          ebasp_region_name VARCHAR2(50) PATH 'ebasp_region_name',
                                          ebasp_sub_region VARCHAR2(50) PATH 'ebasp_sub_region',
                                          ebasp_location VARCHAR2(100) PATH 'ebasp_location',
                                          ebasp_designation VARCHAR2(50) PATH 'ebasp_designation',
                                          b_ebasp_designation VARCHAR2(150) PATH 'b_ebasp_designation',
                                          ebasp_date_of_joining DATE PATH 'ebasp_date_of_joining',
                                          ebasp_grade NUMBER(2) PATH 'ebasp_grade',
                                          ebasp_basic NUMBER(7) PATH 'ebasp_basic',
                                          ebasp_photo_upload VARCHAR2(500) PATH 'ebasp_photo_upload',
                                          ebasp_created_on DATE PATH 'ebasp_created_on',
                                          ebasp_created_by VARCHAR2(50) PATH 'ebasp_created_by')temp1;
ret:=to_char(sql%rowcount);  
COMMIT;

RETURN '<result><status affectedRow='||ret1||'>Success</status></result>';
DBMS_OUTPUT.PUT_LINE(ret);
EXCEPTION
WHEN OTHERS THEN
v_code := SQLCODE;
v_errm := SUBSTR(SQLERRM, 1 , 500);
DBMS_OUTPUT.PUT_LINE('Error code ' || v_code || ': ' || v_errm);
RETURN '<result><status>Error'||v_errm||'</status></result>';
END save_emp_basic_profile;
函数save\u emp\u basic\u profile(employeeData VARCHAR2)返回CLOB为
ret CLOB;
xmldataxmltype;
v_代码;
v_errm VARCHAR2(500);
开始
xmlData:=XMLType(employeeData);
在TBL_EMP_BASIC_PROFILE中插入,从XMLTABLE(“/employees/employee”中选择temp1.*”
传递xmlData
列ebasp_id VARCHAR2(10)路径“ebasp_id”,
ebasp_name VARCHAR2(50)路径“ebasp_name”,
b_ebasp_name VARCHAR2(150)路径“b_ebasp_name”,
ebasp_性别变量2(8)路径“ebasp_性别”,
ebasp_类别VARCHAR2(10)路径“ebasp_类别”,
ebasp_区域_类型VARCHAR2(50)路径“ebasp_区域_类型”,
ebasp_区域名称VARCHAR2(50)路径“ebasp_区域名称”,
ebasp_sub_region VARCHAR2(50)路径“ebasp_sub_region”,
ebasp_位置VARCHAR2(100)路径“ebasp_位置”,
ebasp_标志VARCHAR2(50)路径“ebasp_标志”,
b_ebasp_标识VARCHAR2(150)路径“b_ebasp_标识”,
ebasp\u加入日期路径“ebasp\u加入日期”,
ebasp_坡度编号(2)路径“ebasp_坡度”,
ebasp_基本编号(7)路径“ebasp_基本”,
ebasp_photo_upload VARCHAR2(500)路径“ebasp_photo_upload”,
ebasp_创建日期路径“ebasp_创建日期”,
由VARCHAR2创建的ebasp(50)路径“由创建的ebasp”)temp1;
ret:=to_char(sql%行计数);
犯罪
回归"成功",;
DBMS_OUTPUT.PUT_LINE(ret);
例外情况
当其他人
v_代码:=SQLCODE;
v_errm:=SUBSTR(SQLERRM,1500);
DBMS|u OUTPUT.PUT|u LINE('Error code'|| v|u code | |':'| | v| errm);
返回“Error”| v|u errm | |“”;
结束保存emp基本配置文件;
我的输入pl sql是:

declare
  query_result clob;
begin
  query_result := *package_name*.SAVE_EMP_BASIC_PROFILE
  ('<employees>
    <employee>
        <ebasp_id>1234567890</ebasp_id>
        <ebasp_name></ebasp_name>
        <b_ebasp_name></b_ebasp_name>
        <ebasp_gender></ebasp_gender>
        <ebasp_category></ebasp_category>
        <ebasp_region_type></ebasp_region_type>
        <ebasp_region_name></ebasp_region_name>
        <ebasp_sub_region></ebasp_sub_region>
        <ebasp_location></ebasp_location>
        <ebasp_designation></ebasp_designation>
        <b_ebasp_designation></b_ebasp_designation>
        <ebasp_date_of_joining>to_date(''2-2-2016'',''DD-MM-YYYY'')</ebasp_date_of_joining>
        <ebasp_grade></ebasp_grade>
        <ebasp_basic></ebasp_basic>
        <ebasp_photo_upload></ebasp_photo_upload>
        <ebasp_created_on>to_date(''3-2-2016'',''DD-MM-YYYY'')</ebasp_created_on>
        <ebasp_created_by></ebasp_created_by>
        <econt_cell_number></econt_cell_number>
        <econt_phone_number></econt_phone_number>
        <econt_email></econt_email>
        <econt_village_or_street></econt_village_or_street>
        <b_econt_village_or_street></b_econt_village_or_street>
        <econt_thana></econt_thana>
        <b_econt_thana></b_econt_thana>
        <econt_post_office></econt_post_office>
        <b_econt_post_office></b_econt_post_office>
        <econt_postal_code></econt_postal_code>
        <b_econt_postal_code></b_econt_postal_code>
        <econt_district></econt_district>
    </employee>
</employees>');
end;  
声明
查询结果clob;
开始
查询\u结果:=*包\u名称*。保存\u EMP\u基本\u配置文件
('
1234567890
截止日期(“2016年2月2日”,“年月日”)
截止日期(“2016年3月2日”,“年月日”)
');
结束;

只提供id和1个日期作为输入(id作为主键是必需的)。但是我得到了这个错误:
错误代码-1858:ORA-01858:在需要数字的地方发现了一个非数字字符
。谁能告诉我在日期类型列中输入日期的正确方法是什么。因为我尝试过使用to_date()函数,但效果不佳。

在代码中,您使用to_char而不是to_date('2-2-2016','DD-MM-YYYY')。也许这就是错误的来源?

在代码中,您使用to char而不是to date('2-2-2016','DD-MM-YYYY')。也许这就是错误的来源?

不要将截止日期放在xml中;这样,您就可以拉出一个字符串“to_date”(“2-2-2016”,“DD-MM-YYYY”),然后您希望将其转换为一个日期-即
to_date('to_date”(“2-2-2016”,“DD-MM-YYYY”),
,我认为您可以看到这是一个非起始日期

相反,将日期保留为字符串,例如:
2-2-2016
,将xmltable中列的数据类型更改为varchar2,然后将转换为日期作为插入的一部分,如下所示:

insert into tbl_emp_basic_profile -- where is the list of columns? You should explicitly list the columns you're inserting into, esp in production code!
select ebasp_id,
       ebasp_name,
       b_ebasp_name,
       ebasp_gender,
       ebasp_category,
       ebasp_region_type,
       ebasp_region_name,
       ebasp_sub_region,
       ebasp_location,
       ebasp_designation,
       b_ebasp_designation,
       to_date(ebasp_date_of_joining, 'dd-mm-yyyy') ebasp_date_of_joining,
       ebasp_grade,
       ebasp_basic,
       ebasp_photo_upload,
       to_date(ebasp_created_on, 'dd-mm-yyyy') ebasp_created_on,
       ebasp_created_by
from   xmltable('/employees/employee'
                passing xmldata
                columns ebasp_id varchar2(10) path 'ebasp_id',
                        ebasp_name varchar2(50) path 'ebasp_name',
                        b_ebasp_name varchar2(150) path 'b_ebasp_name',
                        ebasp_gender varchar2(8) path 'ebasp_gender',
                        ebasp_category varchar2(10) path 'ebasp_category',
                        ebasp_region_type varchar2(50) path 'ebasp_region_type',
                        ebasp_region_name varchar2(50) path 'ebasp_region_name',
                        ebasp_sub_region varchar2(50) path 'ebasp_sub_region',
                        ebasp_location varchar2(100) path 'ebasp_location',
                        ebasp_designation varchar2(50) path 'ebasp_designation',
                        b_ebasp_designation varchar2(150) path 'b_ebasp_designation',
                        ebasp_date_of_joining varchar2(10) path 'ebasp_date_of_joining',
                        ebasp_grade number(2) path 'ebasp_grade',
                        ebasp_basic number(7) path 'ebasp_basic',
                        ebasp_photo_upload varchar2(500) path 'ebasp_photo_upload',
                        ebasp_created_on varchar2(10) path 'ebasp_created_on',
                        ebasp_created_by varchar2(50) path 'ebasp_created_by') temp1;

更好的做法是将每个日期的日期掩码用作XML中每个日期节点的属性,这样您就不必事先知道日期字符串的格式;这样,如果生成xml的内容想要更改日期的格式,那么数据库应该看不到它。不过,我知道让XML生成器将其添加进来可能是不可能的。

不要在XML中添加日期;这样,您就可以拉出一个字符串“to_date”(“2-2-2016”,“DD-MM-YYYY”),然后您希望将其转换为一个日期-即
to_date('to_date”(“2-2-2016”,“DD-MM-YYYY”),
,我认为您可以看到这是一个非起始日期

相反,将日期保留为字符串,例如:
2-2-2016
,将xmltable中列的数据类型更改为varchar2,然后将转换为日期作为插入的一部分,如下所示:

insert into tbl_emp_basic_profile -- where is the list of columns? You should explicitly list the columns you're inserting into, esp in production code!
select ebasp_id,
       ebasp_name,
       b_ebasp_name,
       ebasp_gender,
       ebasp_category,
       ebasp_region_type,
       ebasp_region_name,
       ebasp_sub_region,
       ebasp_location,
       ebasp_designation,
       b_ebasp_designation,
       to_date(ebasp_date_of_joining, 'dd-mm-yyyy') ebasp_date_of_joining,
       ebasp_grade,
       ebasp_basic,
       ebasp_photo_upload,
       to_date(ebasp_created_on, 'dd-mm-yyyy') ebasp_created_on,
       ebasp_created_by
from   xmltable('/employees/employee'
                passing xmldata
                columns ebasp_id varchar2(10) path 'ebasp_id',
                        ebasp_name varchar2(50) path 'ebasp_name',
                        b_ebasp_name varchar2(150) path 'b_ebasp_name',
                        ebasp_gender varchar2(8) path 'ebasp_gender',
                        ebasp_category varchar2(10) path 'ebasp_category',
                        ebasp_region_type varchar2(50) path 'ebasp_region_type',
                        ebasp_region_name varchar2(50) path 'ebasp_region_name',
                        ebasp_sub_region varchar2(50) path 'ebasp_sub_region',
                        ebasp_location varchar2(100) path 'ebasp_location',
                        ebasp_designation varchar2(50) path 'ebasp_designation',
                        b_ebasp_designation varchar2(150) path 'b_ebasp_designation',
                        ebasp_date_of_joining varchar2(10) path 'ebasp_date_of_joining',
                        ebasp_grade number(2) path 'ebasp_grade',
                        ebasp_basic number(7) path 'ebasp_basic',
                        ebasp_photo_upload varchar2(500) path 'ebasp_photo_upload',
                        ebasp_created_on varchar2(10) path 'ebasp_created_on',
                        ebasp_created_by varchar2(50) path 'ebasp_created_by') temp1;

更好的做法是将每个日期的日期掩码用作XML中每个日期节点的属性,这样您就不必事先知道日期字符串的格式;这样,如果生成xml的内容想要更改日期的格式,那么数据库应该看不到它。不过,我明白,让XML生成器将其添加进来可能是不可能的。

nah。试过了。此外,由于整个输入字符串都在一个单引号内,所以我必须将单引号放两次。所以我尝试了
到目前为止('2-2-2016','DD-MM-YYYY')
这里这些不是双引号而是两个单引号。不。试过了。此外,由于整个输入字符串都在一个单引号内,所以我必须将单引号放两次。所以我尝试了
到目前为止('2-2-2016','DD-MM-YYYY')
这里这些不是双引号而是两个单引号