AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 175442
Accepted
Christopher Karsten
Christopher Karsten
Asked: 2017-06-06 05:59:56 +0800 CST2017-06-06 05:59:56 +0800 CST 2017-06-06 05:59:56 +0800 CST

如何创建可以将记录插入两个表的存储过程 [Informix]

  • 772

我需要创建一个可以在两个表中插入记录的存储过程

我有以下两个表:

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.

如果数据类型相同,我不明白问题出在哪里

stored-procedures informix
  • 2 2 个回答
  • 7605 Views

2 个回答

  • Voted
  1. Best Answer
    Christopher Karsten
    2017-06-07T04:06:47+08:002017-06-07T04:06:47+08:00

    这似乎对我有用:

    CREATE PROCEDURE sacro.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,
    job_job_type varchar(10))
    
    DEFINE jobid INTEGER;
    SELECT MAX(job_id) + 1 INTO jobid FROM job;
    
    --Add the record to the Job Table
    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_job_type, scan_indicator, job_accept, date_received, date_accept, agent_code, fax_send);
    
    --Add the record to the Doc Submitted Table                                                                                     
    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, jobid, cdr_label, image_release);
    
    
    --Update the workflow table to indicate the document approved date             
    UPDATE sacro:bk_name_workflow set doc_approve_date=dateindexed where reference_no=trak_no;
    
    END PROCEDURE;
    

    我使用的插入语句如下:

    EXECUTE PROCEDURE sacro.sp_indexdocument(30, "M1996000465", "A0814390", "HEN500", current, 1, 0, "\19990160\M\1905\021141\90\A0814386.tif", 5, 1, "DELETE", current, "CM29", "19980018", "Y","OK","N",1,today,today,"B0245",1,"TEST")
    
    • 1
  2. Jonathan Leffler
    2017-06-07T13:31:56+08:002017-06-07T13:31:56+08:00

    不要在不是字符串的东西周围加上引号!

    您有(添加了一些换行符和一个逗号后空格):

    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);
    

    '100'将从字符串转换为 DECIMAL(9,0),但省略引号会更清晰。

    引用的'EXTEND(…)…'表达式只是一个字符串;它不是日期时间文字,不能解释为一个。坦率地说,我认为你会做得更好:

    DATETIME(1999-02-28 09:06:22) YEAR TO SECOND
    

    甚至(带引号):

    '1999-02-28 09:06:22'
    

    而不是表达式:

    EXTEND(MDY(6,28,1999), YEAR to SECOND)+9 UNITS HOUR+6 UNITS MINUTE+22 UNITS SECOND
    

    (当表达式被引用时,你会得到错误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 语句解决这些问题时,您会遇到符号问题:

    INSERT INTO sacro:doc_submitted(…) VALUES(…);
    

    usingsacro:doc_submitted表示“doc_submitted在数据库中找到调用的表sacro”,而您要引用sacro当前数据库中用户拥有的表。为此,您需要在用户名(标准 SQL 中的模式名称)和表名之间有一个.(不是 a )。:

    修复后,您会收到错误消息:

    SQL -236: Number of columns in INSERT does not match number of VALUES.
    

    这是两个插入语句中的一个或另一个中的列名列表和值列表之间的不匹配。我已经使用仔细的布局进行了跟踪,以便我可以看到每个变量都与每个列名匹配。在第一个 INSERT 中,您job_id在列列表中列出列,但不传递job_id. 实际上,您不接受 ajob_id作为参数,因此删除名称是最简单的。

    这段代码“有效”——你必须从这里开始试验:

    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
    );
    
    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,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',
        'Y',
        'B1998025909',
        'N',
        1,
        NULL,
        NULL,
        NULL,
        NULL);
    
    • 0

相关问题

  • 优化此 SQL 查询以提高性能

  • 如何从 Oracle 存储过程中将 CTE 作为 REFCURSOR 返回?

  • 如何确定 mysql 数据库中是否存在过程或函数?

  • 是否有人使用 SQL Server 功能来创建按编号区分的存储过程组?

  • MySQL 存储例程中的动态 SQL

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve