The error I get is "SQL0117 Statement contains wrong number of values".
/Free
exec sql
INSERT INTO NOEDTSR
SELECT * FROM NOEDEH AS deh
WHERE EXISTS (SELECT act.AC2ACT FROM ACTEST AS act
WHERE act.AC2ACT = deh.N1ACTE
AND act.AC2CRB IN('C0','C2')
AND act.AC2TYT = 'DEN')
AND NOT EXISTS (SELECT sin.SISTE FROM SINREG AS sin
WHERE sin.SISTE = deh.N1STE
AND sin.SIGRP = deh.N1GRP
AND sin.SIIND = deh.N1IND
AND sin.SIRANG = deh.N1RANG
AND sin.SIACTE = deh.N1ACTE
AND sin.SIREEL = deh.N1MERG
AND sin.SISECU = deh.N1EBAS)
AND N1DBSS = 20
AND N1DBSA = 21
AND N1TIER = '000000000000000';
/end-free
I'm not specifying column_names here on purpose as I want to copy all of the columns from NOEDEH to NOEDTSR.
These two tables have the same structure as the DDS(Data Description Structure) used to compile both is the exactly same.
Any thoughts?
You've already figured out your issue. Mark provide a simple SQL to easily generate a string that contains a list of columns.
Here's a SQL statement I keep handy. It will allow you to generate one of the following:
Just uncomment the appropriate select *
line at the bottom of the statement.
with selected (system_table_name, system_table_schema)
-- enter file & library name here
as (values ('MYTABLE','MYLIB') )
, tbl as (
select
case
when data_type = 'DECIMAL' then 'packed'
when data_type = 'NUMERIC' then 'zoned'
when data_type = 'TIMESTMP' then 'timestamp'
when data_type = 'INTEGER' then 'int'
else lower(data_type)
end
concat case
when data_type = 'INTEGER' and length >= 8 then '(20'
when data_type = 'INTEGER' and length >= 4 then '(10'
when data_type = 'INTEGER' and length >= 2 then '(5'
when data_type in ('TIMESTMP','DATE','TIME') then ''
else '(' concat length
end
concat case
when numeric_scale is null then ''
when data_type = 'INTEGER' then ''
else ':' concat numeric_scale
end
concat case
when data_type in ('TIMESTMP','DATE','TIME') then ';'
else ');'
end
as rpg_type
,system_column_name, length, numeric_scale,
column_text, column_name, ordinal_position
from qsys2.syscolumns syscolumns
join selected using(system_table_name,system_table_schema)
)
-- build RPG DS
, rpg_ds as (
select lower(system_column_name) concat ' ' concat rpg_type as rpg_ds_subfield
from tbl
order by ordinal_position
)
-- build rpg long name ds
, rpg_ds_long_name as (
select lower(column_name) concat ' ' concat rpg_type as rpg_ds_subfield
from tbl
order by ordinal_position
)
---- build a string of all columns in the table using short names
, list_short_names as (
select listagg(lower(trim(system_column_name)),', ')
within group (order by ordinal_position)
from tbl
)
---- build a string of all columns in the table using short names
, list_long_names as (
select listagg(lower(trim(column_name)),', ')
within group (order by ordinal_position)
from tbl
)
-- use one of these depending on what you're looking for
--select * from rpg_ds_long_name;
--select * from rpg_ds;
--select * from list_long_names;
select * from list_short_names;