首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从表名是局部变量的表中进行选择(Informix)

如何从表名是局部变量的表中进行选择(Informix)
EN

Stack Overflow用户
提问于 2013-02-07 08:17:08
回答 3查看 3.5K关注 0票数 3

我想从表中选择表名是局部变量,列名是另一个局部变量,但我得到以下错误:

指定的表ll_tb_name不在数据库中。

代码语言:javascript
复制
CREATE PROCEDURE rmg_request_file ( al_task_code integer)
RETURNING integer as byte;


DEFINE ll_task_code integer;
DEFINE ll_pdf_column varchar(50);
DEFINE ll_tb_name varchar(60);
DEFINE ll_request_file REFERENCES BYTE;


SELECT pdf_column,table_name INTO  ll_pdf_column ,ll_tb_name  FROM rnmtask WHERE task_code = al_task_code;


FOREACH   

SELECT  ll_pdf_column into  ll_request_file FROM ll_tb_name   

return ll_request_file  with resume ;
end foreach;

end procedure    
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-08 21:31:03

假设您有足够的Informix最近版本(11.70),您应该能够在SPL中使用以下动态SQL:

代码语言:javascript
复制
BEGIN;

CREATE TABLE rnmtask
(
    pdf_column VARCHAR(32) NOT NULL,
    table_name VARCHAR(32) NOT NULL,
    task_code  INTEGER NOT NULL PRIMARY KEY
);

INSERT INTO rnmtask VALUES("symbol", "elements", 1);
INSERT INTO rnmtask VALUES("name", "elements", 2);
INSERT INTO rnmtask VALUES("atomic_number", "elements", 3);

CREATE PROCEDURE rmg_request_file(al_task_code INTEGER)
    RETURNING VARCHAR(255) AS colval;

    DEFINE ll_pdf_column    VARCHAR(50);
    DEFINE ll_tb_name       VARCHAR(60);
    DEFINE stmt             VARCHAR(255);
    DEFINE result           VARCHAR(255);

    SELECT pdf_column, table_name
      INTO ll_pdf_column, ll_tb_name
      FROM rnmtask
     WHERE task_code = al_task_code;

    LET stmt = "SELECT " || ll_pdf_column || " FROM " || ll_tb_name;
    PREPARE p FROM stmt;
    DECLARE C CURSOR FOR p;
    OPEN C;
    WHILE sqlcode = 0
        FETCH C INTO result;
        IF sqlcode != 0 THEN
            EXIT WHILE;
        END IF;
        RETURN result WITH RESUME;
    END WHILE;

    CLOSE C;
    FREE C;
    FREE p;

END PROCEDURE;

EXECUTE PROCEDURE rmg_request_file(1);
EXECUTE PROCEDURE rmg_request_file(2);
EXECUTE PROCEDURE rmg_request_file(3);

ROLLBACK;

这假设数据库中有一个方便的元素表:

代码语言:javascript
复制
CREATE TABLE elements
(
    atomic_number   INTEGER NOT NULL PRIMARY KEY CONSTRAINT c1_elements
                    CHECK (atomic_number > 0 AND atomic_number < 120),
    symbol          CHAR(3) NOT NULL UNIQUE CONSTRAINT c2_elements,
    name            CHAR(20) NOT NULL UNIQUE CONSTRAINT c3_elements,
    atomic_weight   DECIMAL(8, 4) NOT NULL,
    period          SMALLINT NOT NULL
                    CHECK (period BETWEEN 1 AND 7),
    group           CHAR(2) NOT NULL
                    -- 'L' for Lanthanoids, 'A' for Actinoids
                    CHECK (group IN ('1', '2', 'L', 'A', '3', '4', '5', '6',
                                     '7', '8', '9', '10', '11', '12', '13',
                                     '14', '15', '16', '17', '18')),
    stable          CHAR(1) DEFAULT 'Y' NOT NULL
                    CHECK (stable IN ('Y', 'N'))
);

INSERT INTO elements VALUES(  1, 'H',   'Hydrogen',        1.0079, 1, '1',  'Y');
INSERT INTO elements VALUES(  2, 'He',  'Helium',          4.0026, 1, '18', 'Y');
INSERT INTO elements VALUES(  3, 'Li',  'Lithium',         6.9410, 2, '1',  'Y');
INSERT INTO elements VALUES(  4, 'Be',  'Beryllium',       9.0122, 2, '2',  'Y');
INSERT INTO elements VALUES(  5, 'B',   'Boron',          10.8110, 2, '13', 'Y');
INSERT INTO elements VALUES(  6, 'C',   'Carbon',         12.0110, 2, '14', 'Y');
INSERT INTO elements VALUES(  7, 'N',   'Nitrogen',       14.0070, 2, '15', 'Y');
INSERT INTO elements VALUES(  8, 'O',   'Oxygen',         15.9990, 2, '16', 'Y');
INSERT INTO elements VALUES(  9, 'F',   'Fluorine',       18.9980, 2, '17', 'Y');
INSERT INTO elements VALUES( 10, 'Ne',  'Neon',           20.1800, 2, '18', 'Y');
INSERT INTO elements VALUES( 11, 'Na',  'Sodium',         22.9900, 3, '1',  'Y');
INSERT INTO elements VALUES( 12, 'Mg',  'Magnesium',      24.3050, 3, '2',  'Y');
INSERT INTO elements VALUES( 13, 'Al',  'Aluminium',      26.9820, 3, '13', 'Y');
INSERT INTO elements VALUES( 14, 'Si',  'Silicon',        28.0860, 3, '14', 'Y');
INSERT INTO elements VALUES( 15, 'P',   'Phosphorus',     30.9740, 3, '15', 'Y');
INSERT INTO elements VALUES( 16, 'S',   'Sulphur',        32.0650, 3, '16', 'Y');
INSERT INTO elements VALUES( 17, 'Cl',  'Chlorine',       35.4530, 3, '17', 'Y');
INSERT INTO elements VALUES( 18, 'Ar',  'Argon',          39.9480, 3, '18', 'Y');
票数 2
EN

Stack Overflow用户

发布于 2013-02-07 08:20:17

我认为您应该在ll_tb_namell_pdf_column的每一处前缀加上@符号,即使在SELECT INTO中也是如此。

票数 0
EN

Stack Overflow用户

发布于 2013-02-07 08:20:19

使用NDS (本机动态):

代码语言:javascript
复制
EXECUTE IMMEDIATE "SELECT  ll_pdf_column into  ll_request_file FROM :@ll_tb_name"
USING @ll_tb_name;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14746540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档