我需要创建一个可以在两个表中插入记录的存储过程
我有以下两个表:
create table "sacro".doc_submitted
(
doc_id serial not null constraint "sacro".nc_doc_sub00,
doc_category_id decimal(9,0),
ent_no varchar(11,1),
trak_no varchar(12),
indexuser varchar(8),
dateindexed datetime year to second,
doc_status decimal(2,0),
doc_mode decimal(2,0),
doc_path varchar(254),
doc_pages integer,
image_exists smallint,
scan_user varchar(8),
scan_date datetime year to second,
job_type varchar(10),
job_id integer,
cdr_label varchar(255),
image_release char(1)
);
create table "sacro".job
(
job_id serial8 not null ,
ent_no varchar(11,1),
compl_user varchar(8),
trak_no varchar(12),
job_type varchar(10),
scan_indicator varchar(1),
job_accept smallint,
date_received date,
date_accept date,
agent_code varchar(6),
fax_send smallint,
primary key (job_id) constraint "informix".pk_job00
);
我的目标是有一个存储过程,它可以根据两个表中不包括 job_id 和 doc_id 的列在这两个表中插入一条记录。
这是我到目前为止所拥有的:
CREATE PROCEDURE sp_IndexDocument (
doc_category_id decimal(9,0),
ent_no varchar(11,1),
trak_no varchar(12),
indexuser varchar(8),
dateindexed datetime year to second,
doc_status decimal(2,0),
doc_mode decimal(2,0),
doc_path varchar(254),
doc_pages integer,
image_exists smallint,
scan_user varchar(8),
scan_date datetime year to second,
job_type varchar(10),
cdr_label varchar(255),
image_release char(1),
compl_user varchar(8),
scan_indicator varchar(1),
job_accept smallint,
date_received date,
date_accept date,
agent_code varchar(6),
fax_send smallint)
INSERT INTO sacro:doc_submitted (doc_category_id,ent_no,trak_no,indexuser,dateindexed,doc_status,doc_mode,doc_path,doc_pages,image_exists,scan_user,scan_date,job_type,job_id,cdr_label,image_release)
VALUES (doc_category_id,ent_no,trak_no,indexuser,dateindexed,doc_status,doc_mode,doc_path,doc_pages,image_exists,scan_user,scan_date,job_type,cdr_label,image_release);
INSERT INTO sacro:job (ent_no,compl_user,trak_no,job_type,scan_indicator,job_accept,date_received,date_accept,agent_code,fax_send)
VALUES (ent_no,compl_user,trak_no,job_type,scan_indicator,job_accept,date_received,date_accept,agent_code,fax_send);
END PROCEDURE;
我执行以下过程将值插入到两个表中:
EXECUTE PROCEDURE sp_IndexDocument ('100', 'M1997554436', 'M1997554436', 'HEN481', 'EXTEND(MDY(6,28,1999), YEAR to SECOND)+9 UNITS HOUR+6 UNITS MINUTE+22 UNITS SECOND', '1', '0', '\19990107\M\1997\014436\100\1.tif', '2', '1', 'xcel', 'EXTEND(MDY(7,8,1999), YEAR to SECOND)+10 UNITS HOUR+56 UNITS MINUTE+4 UNITS SECOND', 'CM31', '692118', '19990095', 'Y','B1998025909', 'Good', 'B19980259089', 'FILE', 'N', '1', NULL, NULL, NULL, NULL)
我得到以下错误代码:
674: Routine (sp_indexdocument) can not be resolved.
如果数据类型相同,我不明白问题出在哪里
这似乎对我有用:
我使用的插入语句如下:
不要在不是字符串的东西周围加上引号!
您有(添加了一些换行符和一个逗号后空格):
'100'
将从字符串转换为 DECIMAL(9,0),但省略引号会更清晰。引用的
'EXTEND(…)…'
表达式只是一个字符串;它不是日期时间文字,不能解释为一个。坦率地说,我认为你会做得更好:甚至(带引号):
而不是表达式:
(当表达式被引用时,你会得到错误
SQL -1262: Non-numeric character in datetime or interval
。)您在表中有一些奇怪的类型 - DECIMAL(2,0) 不是常见类型(
doc_status SMALLINT CHECK(doc_status BETWEEN -99 AND +99)
例如,考虑一下 - 尽管我怀疑您的意思是BETWEEN 0 AND 99
)。另一个问题是您已将 26 个参数传递给该过程,但
sp_IndexDocument()
您创建的只需要 22 个参数。您还试图通过'19990095'
程序期望的位置image_release CHAR(1)
。事实上,在第二个EXTEND
参数之后,给定参数和预期参数的对齐变得混乱;我无法弄清楚应该是什么。如果您需要针对庞大参数列表的参数,那么此代码就是它。这种不匹配会导致
SQL -674: Routine (sp_indexdocument) can not be resolved
错误,因为 Informix 中的函数可以根据参数列表进行重载,因此您的调用与定义的函数不匹配,因此可能您试图调用一个找不到的不同函数。当您通过编辑 EXECUTE PROCEDURE 语句解决这些问题时,您会遇到符号问题:
using
sacro:doc_submitted
表示“doc_submitted
在数据库中找到调用的表sacro
”,而您要引用sacro
当前数据库中用户拥有的表。为此,您需要在用户名(标准 SQL 中的模式名称)和表名之间有一个.
(不是 a )。:
修复后,您会收到错误消息:
这是两个插入语句中的一个或另一个中的列名列表和值列表之间的不匹配。我已经使用仔细的布局进行了跟踪,以便我可以看到每个变量都与每个列名匹配。在第一个 INSERT 中,您
job_id
在列列表中列出列,但不传递job_id
. 实际上,您不接受 ajob_id
作为参数,因此删除名称是最简单的。这段代码“有效”——你必须从这里开始试验: