[ Narogg @ 14.01.2010. 17:37 ] @
Poštovani,

jedno polje u tablici (varchar2) ima vrijednost npr. ='0,1,3,5,6,8,9'
Moram u PL/SQL-u napisati funkciju koja uzima najveći broj iz ovog polja a da je različit od 8 (osmica ne mora biti prisutna).
Mora biti u obliku funkcije da bi se mogla pozvati u selectu

npr.: Select max_broj_unutar_stringa(t.polje) from table t where t.polje = '0,1,3,5,6,8';
[ Narogg @ 22.01.2010. 11:31 ] @
Riješio sam to ipak uz svesrdnu pomoć googlea :)
Na sljedeći način:

Kreirane su dvije funkcije:

list_element i min_broj

list element splita polje iz baze na osnovu separatora:
CREATE OR REPLACE FUNCTION list_element
(p_string VARCHAR2,
p_element INTEGER,
p_separator VARCHAR2
)
RETURN VARCHAR2
AS
v_string VARCHAR2(32767);
BEGIN
v_string := p_string || p_separator;
FOR i IN 1 .. p_element - 1 LOOP
v_string := SUBSTR(v_string,INSTR(v_string,p_separator)+1);
END LOOP;
RETURN SUBSTR(v_string,1,INSTR(v_string,p_separator)-1);

----
END list_element;
/


A funkcija min_broj uzima najmanji broj (pisao sam da mi treba najveći broj a zapravo mi treba najmanji). Broj znakova koji je sadržan u polju iz kojeg treba izdvojiti najmanji broj je poznat, od 0 do 9 odvojeni zarezima.

CREATE OR REPLACE FUNCTION min_broj
( inp_acid VARCHAR2
)
RETURN VARCHAR2 AS var_min VARCHAR2(32767);

--SET SERVEROUTPUT ON
--DECLARE
var1 VARCHAR2(2);
var2 VARCHAR2(2);
var3 VARCHAR2(2);
var4 VARCHAR2(2);
var5 VARCHAR2(2);
var6 VARCHAR2(2);
var7 VARCHAR2(2);
var8 VARCHAR2(2);
var9 VARCHAR2(2);
var10 VARCHAR2(2);

--var_min NUMBER(2);
BEGIN

FOR rec IN (željeni upit) LOOP
SELECT
list_element (rec.polje, 1, ','),
list_element (rec.polje, 2, ','),
list_element (rec.polje, 3, ','),
list_element (rec.polje, 4, ','),
list_element (rec.polje, 5, ',')
INTO var1, var2, var3, var4, var5
FROM DUAL ;

--izdvajanje najmanjeg broja
var_min :=var1;
IF (var_min > var2)AND (var2!=8) THEN
var_min:=var2;
END IF;

IF (var_min > var3)AND (var3!=8) THEN
var_min:=var3;
END IF;

IF (var_min > var4)AND (var4!=8) THEN
var_min:=var4;
END IF;

IF (var_min > var5)AND (var5!=8) THEN
var_min:=var5;
END IF;

IF (var_min > var6)AND (var6!=8) THEN
var_min:=var6;
END IF;

IF (var_min > var7)AND (var7!=8) THEN
var_min:=var7;
END IF;

IF (var_min > var8)AND (var8!=8) THEN
var_min:=var8;
END IF;

IF (var_min > var9)AND (var9!=8) THEN
var_min:=var9;
END IF;

IF (var_min > var10)AND (var10!=8) THEN
var_min:=var10;
END IF;


END LOOP;
return var_min;

END min_broj;
/


Pozdrav!
[ darkosos @ 19.02.2010. 07:44 ] @
Iako je maksimalna duzina poznata, veci sam pristalica petlji:
var_min := list_element(rec.polje, 1, ',');
for i in 2..length(rec.polje) loop
x := list_element(rec.polje, i, ',');
if var_min > x and x != 8 then
var_min := x;
end if;
end loop;