A表: NAME TYPE TIME B表: ID TYPE_NAME
SAM 1 3 1 病假
SAM 2 4 2 事假
SAM 3 2 3 出差
Bob 1 2
Bob 2 5
Bob 3 1
Rose 1 2
Rose 2 0
Rose 3 3 A type 和 B表 ID对应
要求 通过行列转换查询 A,B表 得到以下格式 C表:
NAME 病假 事假 出差
SAM 3 4 2
Bob 2 5 1
Rose 2 0 3 B表中type_name 数量不定,也可能有更多类型 比如休假,缺勤等
所以要求使用游标读出B表与A表关联
在进行行列转换得到C表,B表TYPE_NAME有几个 则 C表就显示多少个字段
declare
v_sql VARCHAR2(2000);
--c_type b.type_name%type;
cursor c_a is select type_name from B;
begin
v_sql:='select a.name,';
-- open c_a;
for c_type in c_a
--fetch c_a into c_type
loop
v_sql := v_sql ||'sum(decode(b.type_name,''' ||c_type.type_name||
''',a.time)) as ' || c_type;
end loop;
v_sql:=v_sql||' from A a,B b where a.type=b.id group by a.name;'; v_sql := 'CREATE TABLE RESULT AS '||v_sql;
EXECUTE IMMEDIATE v_sql;
end;
报调用'||'参数个数或类型错误
SAM 1 3 1 病假
SAM 2 4 2 事假
SAM 3 2 3 出差
Bob 1 2
Bob 2 5
Bob 3 1
Rose 1 2
Rose 2 0
Rose 3 3 A type 和 B表 ID对应
要求 通过行列转换查询 A,B表 得到以下格式 C表:
NAME 病假 事假 出差
SAM 3 4 2
Bob 2 5 1
Rose 2 0 3 B表中type_name 数量不定,也可能有更多类型 比如休假,缺勤等
所以要求使用游标读出B表与A表关联
在进行行列转换得到C表,B表TYPE_NAME有几个 则 C表就显示多少个字段
declare
v_sql VARCHAR2(2000);
--c_type b.type_name%type;
cursor c_a is select type_name from B;
begin
v_sql:='select a.name,';
-- open c_a;
for c_type in c_a
--fetch c_a into c_type
loop
v_sql := v_sql ||'sum(decode(b.type_name,''' ||c_type.type_name||
''',a.time)) as ' || c_type;
end loop;
v_sql:=v_sql||' from A a,B b where a.type=b.id group by a.name;'; v_sql := 'CREATE TABLE RESULT AS '||v_sql;
EXECUTE IMMEDIATE v_sql;
end;
报调用'||'参数个数或类型错误
V_SQL VARCHAR2(2000);
--c_type b.type_name%type;
CURSOR C_A IS
SELECT id,TYPE_NAME FROM TEST_B;
BEGIN
V_SQL := 'select a.name,';
-- open c_a;
FOR C_TYPE IN C_A LOOP
V_SQL := V_SQL||' sum(decode(b.type_name,'''|| C_TYPE.TYPE_NAME ||''',a.time)) as "' || C_TYPE.type_name||'",';
END LOOP;
v_sql:=rtrim(v_sql,',');
V_SQL := V_SQL || ' from TEST_a a,TEST_B b where a.type=b.id group by a.name'; V_SQL := 'CREATE TABLE RESULT_test nologging AS ' || V_SQL;
dbms_output.put_line(v_sql);
EXECUTE IMMEDIATE V_SQL;
END;
as ' || c_type; 这个应该是 c_type.TYPE_NAME
还得再加个逗号,然后退出游标循环时再把最后一个逗号去掉