[ ik0 @ 22.02.2017. 16:58 ] @
Dakle prvi put se susrecem sa oraclom i okolinom tako imam velikih poteskoca, ako moze neko da mi pomogne da "prevedem" ovaj kod bio bi stvarno zahvalan, skoro ceo dan se mucim te ono te ovo al mi neide. Hvala vam


Code:
DECLARE @strng varchar(max) = 'bzz';
DECLARE @strngOut varchar(max) = '';
DECLARE @incremented bit = 1;
SET @strng = REVERSE(@strng);
 
SELECT @strngOut = @strngOut + CHAR(CASE WHEN n.Number + @incremented = 26 THEN 0 ELSE n.Number 
+ @incremented END + 97), @incremented = CASE WHEN n.Number + @incremented = 26 THEN 1 ELSE 0 END
FROM (
       SELECT (CAST(ASCII(substring(@strng, v.number+1, 1)) AS int) - 97) AS Number
       FROM master..spt_values v
       WHERE v.type = 'P' AND v.number < len(@strng)
) n;
 
IF (@incremented = 1)
BEGIN
       SET @strngOut = @strngOut + 'a';
END
 
SELECT REVERSE(@strngOut)
[ ik0 @ 22.02.2017. 18:16 ] @
Nekako sam stigo do prikraja al ne znam kako resiti ovo sa master samo taj deo je ostao pls


Code:
PROCEDURE GenerateNewPieceID (p_PieceID IN PIECE.PIECE_ID%TYPE)
IS
   v_Strng       VARCHAR (100) := 'bzz';
   v_strngOut    VARCHAR (100);
   v_incremented   NUMBER := 1;
   v_Test        VARCHAR(100);
BEGIN

   SELECT REVERSE (v_Strng)
   INTO v_Strng
   FROM DUAL;

   SELECT   v_strngOut
          + CHR (CASE WHEN n.Number1 + v_incremented = 26 THEN 0
                      ELSE n.Number1 + v_incremented END + 97),
                 CASE WHEN n.Number1 + v_incremented = 26 THEN 1 
                      ELSE 0 END
     INTO v_strngOut, v_incremented
     FROM (SELECT (CAST (ASCII (SUBSTR (v_strng, v.number1 + 1, 1)) AS NUMBER (10))- 97) AS Number1
           FROM master.spt_values v --ne znam u oraclu sto koristiti :S
           WHERE v.TYPE = 'P' AND v.Number1 < LENGTH (RTRIM (v_strng))) n;

   IF (v_incremented = 1)
   THEN
      v_strngOut := v_strngOut || 'a';
   END IF;

   SELECT REVERSE (v_strngOut) 
   INTO v_Test
   FROM DUAL;
   
   
END;
[ djoka_l @ 22.02.2017. 19:05 ] @
A da objasniš šta želiš da dobiješ?

Oracle ima VARCHAR2 tip.
Oracle ima funkcije i procedure. Ako je funkcija, onda mora da se tako deklariše i da ima return type i return naredbu. Ako je procedura, onda je suludo da radi samo select, a da nema ni jedan OUT parametar jer se onda apsolutno ništa ne desi...
[ ik0 @ 22.02.2017. 20:34 ] @
Kao sto sam rekoa poceo sam samo da pisem proceduru cisto da vidim dokle mogu da doguram t.e koliko mogu da "prevedem" zato nema out, inace da procedura je i out bi bio v_Test. A inace sto bi trebala procedura da radi sam stavio kao hyper link u prvom postu posto smo pisali oko toga da ne pisem opet. Hvala

Procedura radi generisanje slova (AlphaNumeric Sequence) primer

A AA AAA
B AB ABA
C AC ACA
. .. ...
. .. ...
. .. ...
Z ZZ ZZZ
[ djoka_l @ 22.02.2017. 20:57 ] @
Code:

create or replace function next_char_seq( currid in varchar2) return varchar2 is
  carry integer := 1;
  res varchar2(100);
  currnum number;
begin
  for i in reverse 1..length(currid) loop
    currnum := ascii(upper(substr(currid,i,1))) - ascii('A') + carry;
    carry := currnum/26;
    res := chr(mod(currnum, 26)+ascii('A')) || res;
  end loop;
  
  if carry = 1 then
    res := 'A' || res;
  end if;
  
  return res;
end;
/
select next_char_seq('a'), next_char_seq('z'), next_char_seq('aaz') from dual;


Funkcija očekuje string koji se sastoji od slova a-z (bez obzira da li su mala ili velika), a vraća string koji je za "jedan" veći od ulaznog stringa (uvek vraća UPPERCASE string).
[ ik0 @ 22.02.2017. 21:05 ] @
Hvala najlepse. Pozdrav
[ ik0 @ 22.02.2017. 22:09 ] @
Ima neki bag ne vidim vise sto je ispusteno ali probaj sa MM t.e AMM i tako dalje sve sto je MN+ pretvara pogresno.

Code:

Naprimer ovo 
FROM master..spt_values v
WHERE v.type = 'P' AND v.number < len(@strng)
u mssql bi bilo lista od 2048 broja t.e 0 do 2047


Neki nacin da implemetiram to u oraclu bi bilo izvrsno nego da koristim loop i sl, moje misljenje i svakako skratilo bi mi muke :D
[ djoka_l @ 23.02.2017. 08:07 ] @
U pravu si, treba:

carry := trunc(currnum/26);

Mislio sam da će mi zbog integer tipa automatski raditi celobrojno deljenje, ali Oracle ipak zaokružuje. Evo celog koda, dodata i obrada grešaka.

Code:
create or replace function next_char_seq( currid in varchar2) return varchar2 is
  carry integer := 1;
  res varchar2(100);
  currnum number;
  ch varchar2(1);
  invalid_character exception;
begin
  for i in reverse 1..length(currid) loop
    ch := upper(substr(currid,i,1));
    if ch < 'A' or ch > 'Z' then
      raise invalid_character;
    end if;
    currnum := ascii(ch) - ascii('A') + carry;
    carry := trunc(currnum/26);
    res := chr(mod(currnum, 26)+ascii('A')) || res;
  end loop;
  
  if carry = 1 then
    res := 'A' || res;
  end if;
  
  return res;
end;
/

select next_char_seq('mm'), next_char_seq('z'), next_char_seq('aaz') from dual;
select next_char_seq('1') from dual;
[ ik0 @ 23.02.2017. 08:51 ] @
Hvala jos jednom, mnogo mi znaci ova pomos :)