1

我有一个存储过程:

程序 qr_get_dep_boss(...,...)

接受两个 params( year, main_code) 并返回一个记录 theboss_num和 his name 。

我想创建另一个过程并在上一个过程调用上进行循环,并outer join使用另一个查询的结果

SELECT 
  year,
  main_code,
  name,
  CASE 
    WHEN father_code in(-1)  THEN NULL
    ELSE father_code 
  END AS father_code,main_code || '_' || year AS main_id, 
  (SELECT COUNT(*) 
   FROM sm_r_build 
   WHERE father_code = sc.main_code 
     AND year = (SELECT MAX(year)
                 FROM st_quit_info)) childcount,
   main_code||'_'|| father_code AS serial 
FROM sm_r_build sc 
WHERE year=(SELECT MAX(year)FROM st_quit_info)

所以我想要结果:

year,main_code,name,father_code,main_id,childcount,serial,boss_num,boss_name

我试试这个:

create procedure new_get_alldepwithboss()
returning int as year , int as main_code ,nvarchar(100) as name,int as father_code,nvarchar(255) as main_id,int as childcount,int as ll_boss_num,nvarchar(100) as ll_boss_name 

define ll_year int;
define ll_main_code int;
define ll_name nvarchar(100);
define ll_father_code int;
define ll_main_id nvarchar(255) ;
define ll_childcount int;
define ll_boss_num int;
define ll_boss_name nvarchar(100);

foreach 
SELECT year,main_code,name,CASE WHEN father_code in(-1)  THEN NULL ELSE father_code END AS father_code,main_code || '_' || year AS main_id, (SELECT COUNT(*) 
FROM sm_r_build 
WHERE father_code=sc.main_code AND year= (SELECT MAX(year)
FROM st_quit_info)) childcount ,a.emp_num,a.emp_name
INTO ll_year ,ll_main_code,ll_name  ,ll_father_code ,ll_main_id ,ll_childcount ,ll_boss_num,ll_boss_name
FROM sm_r_build  sc , TABLE(FUNCTION qr_get_dep_boss(ll_main_code, ll_year))AS a(emp_num,emp_name)  
WHERE year=(SELECT MAX(year)FROM st_quit_info)


return ll_year , ll_main_code, ll_name,ll_father_code,ll_main_id, ll_childcount ,  ll_boss_num,ll_boss_name with resume;

end foreach

end procedure 

但徒劳!

4

2 回答 2

1

在 SQL 服务器的情况下,我建议使用而不是函数而不是存储过程。函数的标题应该是:

CREATE FUNCTION qr_get_dep_boss( @year DATE, @main_code INT)
RETURN @t TABLE ( boss_num INT, boss_name VARCHAR(50))
AS
... ( here boss_num and boss_name  should be set )

在您的主要查询中,您可以通过以下方式使用此功能:

SELECT year, main_code, ... , t.bos_num , t.boss_name 
FROM ...
CROSS APPLY
qr_get_dep_boss(year, main_code) t

但我不确定在 Informix 中是否可行,以防万一你总是可以定义两个返回单个值的函数。GL!

于 2013-03-12T09:02:34.437 回答
1

如果我理解正确,您不需要第二个程序。

您需要做的是使用RETURN xxx WITH RESUME程序 qr_get_dep_boss()

手册中复制的示例。

CREATE FUNCTION series (limit INT, backwards INT) RETURNING INT;
   DEFINE i INT;
   FOR i IN (1 TO limit)
      RETURN i WITH RESUME;
   END FOR;
   IF backwards = 0 THEN
      RETURN;
   END IF;
   FOR i IN (limit TO 1 STEP -1)
      RETURN i WITH RESUME;
   END FOR;
END FUNCTION; -- series
于 2013-03-13T16:04:41.207 回答