Firebird 中没有为另一个数据库中的过程的执行语句返回任何行

问题描述 投票:0回答:1

我需要编写一个过程,该过程可以处理单独数据库中另一个过程的行结果集。但每次我调用它时,我都没有得到任何行,就好像表是空的一样。

/* Source procedure */
CREATE OR ALTER PROCEDURE get_scanner_active_tags_by_hh_type (
    scannerreferenceid TYPE OF COLUMN scanners.referenceid,
    hourtype TYPE OF COLUMN tagscannerpairings.hourtype)
RETURNS (
    tagid TYPE OF COLUMN tagscannerpairings.tagid)
AS
BEGIN
  FOR SELECT tagid
    FROM tagscannerpairings tsp JOIN scanners so ON tsp.scannerreferenceid = so.referenceid
    WHERE EXISTS (
      SELECT *
      FROM scanners si
      WHERE TRIM(TRAILING FROM si.referenceid) = TRIM(TRAILING FROM tsp.scannerreferenceid) AND si.referenceid = :scannerreferenceid) AND ison = 'T' AND hourtype = :hourtype
      ORDER BY tagid
    INTO :tagid
  DO
    SUSPEND;
END

/* Procedure of issue */
CREATE OR ALTER PROCEDURE write_hh_records (
    scannername vchar30_req,
    hh_type hour_type)
RETURNS (
    tagid INTEGER)
AS
BEGIN
  FOR EXECUTE STATEMENT ('EXECUTE PROCEDURE get_scanner_active_tags_by_hh_type(:scanner, :hh);') (scanner := :scannername,  hh := :hh_type)
    AS USER '<user>'
    PASSWORD '<password>'
    ROLE '<role>'
    ON EXTERNAL 'xx.xx.x.xx/3050:Config'
    INTO :tagid
  DO
    SUSPEND;
END
stored-procedures firebird firebird-psql
1个回答
0
投票

一个

EXECUTE PROCEDURE
最多返回一行,据我所知,你不能用
FOR EXECUTE STATEMENT
动态执行它,而只能用
EXECUTE STATEMENT
动态执行它。但是,我还没有仔细检查这个答案,否则它可能最多会返回one行。

从名字上看,存储过程

get_scanner_active_tags_by_hh_type
返回多行,这意味着你需要使用
select * from get_scanner_active_tags_by_hh_type(...)
来执行它,然后你可以使用
FOR EXECUTE STATEMENT
动态执行它。

© www.soinside.com 2019 - 2024. All rights reserved.