Avatar billede d_warma Nybegynder
16. august 2004 - 18:46 Der er 11 kommentarer

PL/SQL spørgsmål

Hej,

Jeg har brug for lidt hjælp til at erklære en variable.

Jeg har en masse snapshots af et system (MON_DD_YYYY_Tabelnavn) og jeg skal have læst noget data  fra nogle af snapshot'ene over en ny tabel.

Jeg har lavet en insert statement, der fanger de relevante data for een tabel.

Jeg vil nu gerne have lavet en procedure, hvor jeg kun skal angive datoen, hvorefter proceduren skulle loade de relevante data over i en tabel:

variable:
v_load_date_text      := to_char('dato','MON_DD_YYYY)
account_tabel          := ||v_load_date_text||_db2_accontpf

INSERT INTO TEST_STATUSTABEL
(SELECT 
(p_load_date) STATUSDATE,
ACCOUNT.krkntn group_account_no,
etc.
bla bla bla
FROM account_tabel
WHERE
GROUP BY
etc...

Mit problem er, at jeg kan ikke få variablen til at fungere i FROM linien..

Hvad gør jeg galt?
Avatar billede peter_r Nybegynder
16. august 2004 - 19:28 #1
Så vidt jeg lige husker, så kan du kun bruge variable som kriterier i where delen, mens tabelnavnet ikke kan være en variabel.

Men du kan i hvert fald bruge EXECUTE IMMEDIATE v_statement
hvor v_statement er en variabel indeholdende det hele: "INSERT  INTO .... GROUP BY etc...".

Noget andet er, at du tilsyneladende har en række ens tabeller, hvis eneste forskel er navnet og forskellen er en dato.

Måske skulle du overveje at bruge partitions, hvor du måske ikke skiller pr. dag, men f.eks. pr. uge eller måned. Så ville det være nemmere at få ud bagefter.

mvh

peter_r
Avatar billede d_warma Nybegynder
16. august 2004 - 22:28 #2
Det har jeg prøvet nu, og det ser ud til at den compiler uden fejl.
Men når jeg skal køre proceduren og skriver feks.
exec prc_delinquency_table_new(to_date('30-11-2003','dd-mm-yyyy'));
så får jeg en ora-06512??

CREATE OR REPLACE PROCEDURE "PRC_DELINQUENCY_TABLE_NEW" (p_load_date IN DATE)
IS

v_load_date_text                VARCHAR2(30) := NULL;
v_account                      VARCHAR2(30) := NULL;
v_DELINQUENCY                  VARCHAR2(500) := NULL;

BEGIN

v_load_date_text              := TO_CHAR(p_load_date,'MON_DD_YYYY');
v_DELINQUENCY                  :='insert into test_statustabel SELECT (p_load_date) STATUSDATE, ACCOUNT.krkntn group_account_no, ACCOUNT.krkipn account_holder_cust_no, ACCOUNT.krknst account_status, ACCOUNT.kravst agreement_status, (ACCOUNT.krsldo / 100) current_balance, (account1.krsldo / 100) cap_balance, (CASE WHEN SUM (account_structure.krres1 / 100) > 25 THEN (ACCOUNT.krsldo / 100) ELSE 0 END) dpd_1_to_29, (CASE WHEN SUM (account_structure.krres1 / 100) > 25 THEN (ACCOUNT.krsldo / 100) ELSE 0 END) dpd_30_to_59, (CASE WHEN SUM (account_structure.krres3 / 100) > 25 THEN (account1.krsldo / 100) ELSE 0 END) DPD_60_to_89, (CASE WHEN SUM (account_structure.krres4 / 100) > 25 THEN (account1.krsldo / 100) ELSE 0 END) DPD_90_to_119 FROM '||v_load_date_text||'_DB2_ACCONTPF ACCOUNT, '||v_load_date_text||'_DB2_ACCONTPF account1, '||v_load_date_text||'_DB2_ACCsTrPF ACcount_structure WHERE (    (ACCOUNT.krkntn = account_structure.krgacc(+)) AND (account_structure.krkntn = account1.krkntn(+)) AND (ACCOUNT.krsplv = 0) AND (account1.krsplv = 3)) GROUP BY ACCOUNT.krkntn, ACCOUNT.krkipn, ACCOUNT.krknst, ACCOUNT.kravst, (account1.krsldo / 100))';
EXECUTE IMMEDIATE v_DELINQUENCY;


COMMIT;
END;
/
Avatar billede peter_r Nybegynder
16. august 2004 - 22:41 #3
Er du sikker på, at din variabel v_DELINQUENCY er stor nok, mit øjemål siger mig det er mere end 500 tegn ?
Avatar billede d_warma Nybegynder
16. august 2004 - 22:45 #4
kunne godt være, men ville den så compile uden fejl?
Avatar billede peter_r Nybegynder
16. august 2004 - 22:49 #5
Ja, det tjekker den ikke, det er en typisk runtime fejl at man kommer til at putte for meget i
Avatar billede d_warma Nybegynder
16. august 2004 - 22:50 #6
har forsøgt at øge til 1500, får stadig samme fejl - dog havde jeg overset en ora-00933, men kan ikke umiddelbart finde den?
Avatar billede peter_r Nybegynder
16. august 2004 - 23:01 #7
Jeg tror du måske har en parentes slut for meget helt til slut i variablen?
Avatar billede d_warma Nybegynder
16. august 2004 - 23:15 #8
nu melder  den ora-00904 invalid identifier på p_load_date??
Udover ora-06512
Avatar billede peter_r Nybegynder
16. august 2004 - 23:26 #9
Prøv evt. at udføre select-statementet som svarer hertil (altså uden Insert into..) så kan du måske få en bedre besked, men skal du ikke også lave Group by (p_load_date) STATUSDATE ? (og hvis ikke det kan lade sig gøre, så skriv MAX(p_load_date)

Jeg smutter iøvrigt for idag...
Avatar billede d_warma Nybegynder
16. august 2004 - 23:30 #10
jeg forsøger mig i morgen... jeg er også færdig for idag..
Avatar billede d_warma Nybegynder
29. oktober 2004 - 08:57 #11
kan ikke huske hvad det endte op med.
Peter_r vil du ikke lave et svar, så får du points'ene..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester