1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

t-sql -> plsql "prevod"

Дискусија во форумот 'Microsoft SQL Server, MySQL, PostgreSQL, Oracle, S' започната од katerina87, 22 Февруари 2017.

  1. katerina87

    katerina87
    Intern

    3
    0
    22 Февруари 2017
    Машко
    Денеска прв пат се сретнав со oracle и имам една задача да ја завршам, бидејќи прв пат се сретнувам со oracle задачата си ја напишав во mssql и мислев дека ковертирањето ке биде лесно ама како што можам да видам и не е баш. Нешто успеав нешто не, па барам мала помош од вас. Иначе процедурате генерира alphanumeric sequence
    A, B, C....Z
    AA, AB, AC....ZZ
    AAA, ABA,ACA....ZZZ

    еве го mssql

    Код:
    DECLARE @strng varchar(max) = 'bzz';
    DECLARE @strngOut varchar(max) = '';
    DECLARE @incremented bit = 1;
    SET @strng = REVERSE(@strng);
    
    SELECT @strngOut = @strngOut + CHAR(CASE WHEN n.Number1 + @incremented = 26 THEN 0 ELSE n.Number1 + @incremented END + 97), @incremented = CASE WHEN n.Number1 + @incremented = 26 THEN 1 ELSE 0 END
    FROM (
           SELECT (CAST(ASCII(substring(@strng, v.number+1, 1)) AS int) - 97) AS Number1
           FROM master..spt_values v
           WHERE v.type = 'P' AND v.number < len(@strng)) AS n;
    
    IF (@incremented = 1)
    BEGIN
           SET @strngOut = @strngOut + 'a';
    END
    
    SELECT REVERSE(@strngOut)
    
    И еве го делот каде застанав

    Код:
    PROCEDURE GenerateNewPieceID (p_PieceID IN PIECE.PIECE_ID%TYPE)
    IS
       v_Strng       VARCHAR (100) := 'bzz';
       v_strngOut    VARCHAR (100);
       v_incremented   NUMBER(10) := 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 sto koristi oracle namesto master data
               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;
    
     
  2. xenon

    xenon
    Guru

    3,791
    9,443
    15 Јануари 2011
    Машко
    Код:
     v_strng varchar(max) := 'bzz';
     v_strngOut varchar(max) := '';
     v_incremented number(1) := 1;
    v_strng := REVERSE(v_strng);
    
    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.number+1, 1)) AS number(10)) - 97) AS Number1
           FROM master.spt_values v
           WHERE v.type = 'P' AND v.number < length(rtrim(v_strng))) AS n;
    
    IF (v_incremented = 1)
    THEN
           v_strngOut := v_strngOut || 'a';
    END IF;
    
    SELECT REVERSE(v_strngOut) FROM dual;
     
  3. katerina87

    katerina87
    Intern

    3
    0
    22 Февруари 2017
    Машко
    Sekako deka ne raboti :D

    ama ova raboti

    Код:
    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;
    
    ЕДИТ:

    Има баг и ова ама ќе го подсредиме :) работи до "MN" се што е поголемо од MN дава погрешен резултат. Не знам нема ли нешто да го замени овој ред например

    Код:
    На пример ова во mssql
    FROM master..spt_values v
    WHERE v.type = 'P' AND v.number < len(@strng)
    би била лоста од 2048 broja т.е 0 do 2047, е сега да не правам јас табели и сл ке помогне ли некој тој дел од кодот да го решам само
    
     
    Последна промена: 22 Февруари 2017
  4. katerina87

    katerina87
    Intern

    3
    0
    22 Февруари 2017
    Машко
    Еве ја :)

    Код:
    CREATE OR REPLACE FUNCTION next_char_seq (p_currid in VARCHAR2)  RETURN VARCHAR2 IS
     
      v_carry   INTEGER := 1;
      v_res     VARCHAR2(100);
      v_currnum NUMBER;
      v_ch varchar2(1);
      v_invalid_character exception;
    BEGIN
    
       FOR i IN REVERSE 1..LENGTH(p_currid) LOOP
        v_ch := UPPER(SUBSTR(p_currid,i,1));
      
        IF v_ch < 'A' OR v_ch > 'Z' THEN
          RAISE v_invalid_character;
        END IF;
    
      
        v_currnum := ASCII(v_ch) - ASCII('A') + v_carry;
        v_carry := TRUNC(v_currnum/26);
        v_res := CHR(MOD(v_currnum, 26) + ASCII('A')) || v_res;
      END LOOP;
     
      IF v_carry = 1 THEN
        v_res := 'A' || v_res;
      END IF;
     
      RETURN v_res;
    END;
    /
    
     
Слични теми
  1. Laki Luciano
    Одговори:
    3
    Прегледи:
    1,172
  2. dime_zd
    Одговори:
    5
    Прегледи:
    16,495
  3. kimi makedonski
    Одговори:
    22
    Прегледи:
    8,071
  4. MIDNIGHT WALKER
    Одговори:
    2
    Прегледи:
    910
  5. bozidarBT
    Одговори:
    5
    Прегледи:
    1,258
Вчитување...

Сподели

Вчитување...