PLSQL Oracle
mariaczi - 30-03-2007 00:07
PLSQL Oracle
witam,
mam taki kawałek kodu
Kod:
declare sql_query string(250);
begin sql_query := 'select * from skp where id_kh = :p_id_sp and anu = ''N'''; if(:data_od is not null) then sql_query := sql_query || ' and dat_w < to_date(''' || :data_od || ' 00:01'', ''YYYY-MM-DD HH24:MI'')'; end if; sql_query := sql_query || ' order by id;'; dbms_output.put_line(to_char(sql_query)); for cur_skp in (SQL_QUERY); loop -- ciało loop'a end loop; end;
jak wstawić sql_query w miejsce SQL_QUERY? "normalne wpisanie" nie działa :( chodzi mi o skonstruowanie zapytania w zależności od podania/nie podania parametrów a następnie wykonania go i "obrobienia odpowiedzi w pętli
pzdr. i z góry podziękowania za pomoc
mhm - 30-03-2007 00:07
mariaczi napisał(a): > chodzi mi o skonstruowanie zapytania w zależności od podania/nie > podania parametrów a następnie wykonania go i "obrobienia odpowiedzi w > pętli > > pzdr. i z góry podziękowania za pomoc
mam nadzieję, że o to biega... z FAQ oraclowego:
-- Using bind variables... sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)'; EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;
-- Returning a cursor... sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
-- mhm.
Marek Chmielewski - 30-03-2007 00:07
mariaczi napisał(a): > witam, > > mam taki kawałek kodu > >
Kod:
> declare > sql_query string(250); > > begin > sql_query := 'select * from skp where id_kh = :p_id_sp and anu = > ''N'''; > if(:data_od is not null) then > sql_query := sql_query || ' and dat_w < to_date(''' || :data_od || > ' 00:01'', ''YYYY-MM-DD HH24:MI'')'; > end if; > sql_query := sql_query || ' order by id;'; > dbms_output.put_line(to_char(sql_query)); > for cur_skp in (SQL_QUERY); > loop > -- ciało loop'a > end loop; > end; >
> > jak wstawić sql_query w miejsce SQL_QUERY? > "normalne wpisanie" nie działa :( > chodzi mi o skonstruowanie zapytania w zależności od podania/nie > podania parametrów a następnie wykonania go i "obrobienia odpowiedzi w > pętli > > pzdr. i z góry podziękowania za pomoc
Raczej nie tędy droga. Spróbuj coś takiego:
DECLARE CURSOR c_sql_query(p_id_sp skp.id_kh%TYPE, data_od skp.dat_w%TYPE) IS SELECT * FROM skp WHERE id_kh < p_id_sp AND anu = 'N' AND ( dat_w < data_od OR data_od IS NULL) ORDER BY pla_id desc; BEGIN FOR r IN c_sql_query(:p_id_sp, :data_od) LOOP -- ciało loop'a END LOOP; END;
-- ___ _ _ ___ ___ ___ |__ |\ | | | |__ |__| ender [małpa] mch (kropka) one (kropka) pl |__ | \| |__| |__ | \ My reply-adress is a spamtrap. Mój adres zwrotny jest pułapką. Nie pisz!
mariaczi - 30-03-2007 00:07
On Thu, 29 Mar 2007 11:08:23 +0200, mhm <mhm@WYTNIJ_TO.si.pl> wrote:
>mam nadzieję, że o to biega... >z FAQ oraclowego: > > -- Using bind variables... > sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)'; > EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location; > > -- Returning a cursor... > sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; > EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; To widziałem; nie do końca o to. Chodzi mi o poskładanie zapytania w zależności od tego czy parametr został podany czy nie. Jesli parametr nie został podany to nie dokleja do zapytania dodatkowego 'and', jesli został podany to dokleja 'and' z pewną kosmetyką.
mariaczi - 30-03-2007 00:07
On Thu, 29 Mar 2007 11:23:57 +0200, Marek Chmielewski <pulapka_na_spam@op.pl> wrote:
>Raczej nie tędy droga. >Spróbuj coś takiego: > >DECLARE > CURSOR c_sql_query(p_id_sp skp.id_kh%TYPE, > data_od skp.dat_w%TYPE) IS > SELECT * > FROM skp > WHERE id_kh < p_id_sp > AND anu = 'N' > AND ( dat_w < data_od > OR data_od IS NULL) ^^^^^^^^^^ mam na myśli że parametr nie został podany, a nie sytuację, że pole jest puste > ORDER BY pla_id desc; >BEGIN > FOR r IN c_sql_query(:p_id_sp, :data_od) LOOP > -- ciało loop'a > END LOOP; >END;
być może źle analizuje problem... zaraz spróbuję za Twoją radą pzdr.
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 30-03-2007 00:07
mariaczi wrote: > Chodzi mi o poskładanie zapytania w zależności od tego czy parametr > został podany czy nie. Jesli parametr nie został podany to nie dokleja > do zapytania dodatkowego 'and', jesli został podany to dokleja 'and' z > pewną kosmetyką. http://asktom.oracle.com/pls/asktom/...:1288401763279
-- Michał Kuratczyk
mariaczi - 30-03-2007 00:07
On Thu, 29 Mar 2007 11:23:57 +0200, Marek Chmielewski <pulapka_na_spam@op.pl> wrote:
>Raczej nie tędy droga. >Spróbuj coś takiego: > >DECLARE > CURSOR c_sql_query(p_id_sp skp.id_kh%TYPE, > data_od skp.dat_w%TYPE) IS > SELECT * > FROM skp > WHERE id_kh < p_id_sp > AND anu = 'N' > AND ( dat_w < data_od > OR data_od IS NULL) > ORDER BY pla_id desc; >BEGIN > FOR r IN c_sql_query(:p_id_sp, :data_od) LOOP > -- ciało loop'a > END LOOP; >END; Dzięki wielkie, hula :) pozdro.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?Poszukjue_ksi=B1=BFki_"Oracle_?= =?ISO-8859-2?Q?optymalizacja_wydajno=B6ci"..?=
zanotowane.pldoc.pisz.plpdf.pisz.pllubiatowo.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|