- Complete PDB export/import workflow (16 scripts in clienti/oracle-xe-21c/import/) - Recreare PDB script with step-by-step guide (recreare_pdb.sql) - Universal audit cleanup script for Oracle XE 11g-21c (cleanup_audit.sql) - Troubleshooting guide with all lessons learned (depanare-ora-12954-spatiu.md) - Fixed: DIRECTORY grant syntax, DBMS_LOCK grant, remap_tablespace USERS:ROA, impdp quoted AS SYSDBA for Windows, AWR retention 8 days, datafile full path - Updated roa-windows-setup docs with XE prevention steps and gotchas table Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
956 lines
34 KiB
MySQL
956 lines
34 KiB
MySQL
-- 05_sys_code_objects.sql
|
|
-- Create SYS custom code objects (packages, procedures, functions)
|
|
-- Source: backup/05_sys_code_objects.sql
|
|
-- Note: UTL_MAIL and UTL_MAIL_INTERNAL excluded (Oracle built-in)
|
|
|
|
-- ============================================================================
|
|
-- AUTH_PACK Package Specification
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PACKAGE "SYS"."AUTH_PACK" is
|
|
|
|
-- Author : MARIUS.ATANASIU
|
|
-- Created : 11/5/2005 9:58:27 AM
|
|
-- Purpose :
|
|
|
|
procedure verifica_program;
|
|
|
|
procedure verifica_licenta(v_sid IN NUMBER, v_program IN VARCHAR2);
|
|
procedure verifica_licenta_luna(v_an IN NUMBER,
|
|
v_luna IN NUMBER,
|
|
v_tip IN NUMBER);
|
|
procedure verifica_numar_firme;
|
|
|
|
procedure adauga_serie(V_ID_PROGRAM IN NUMBER,
|
|
V_SERIE IN VARCHAR2,
|
|
V_ID_UTILAD IN NUMBER);
|
|
|
|
procedure sterge_serie(V_ID_PROGRAM IN NUMBER, V_ID_UTILS IN NUMBER);
|
|
|
|
procedure verifica_serie(V_ID_PROGRAM IN NUMBER, V_SERIE IN RAW);
|
|
|
|
function selecteaza_serie(V_ID_PROGRAM IN NUMBER) return varchar2;
|
|
|
|
function selecteaza_nr_util(V_ID_PROGRAM IN NUMBER) return number;
|
|
|
|
function selecteaza_data_val(V_ID_PROGRAM IN NUMBER) return date;
|
|
|
|
function decripteaza_serie(V_ID_PROGRAM IN NUMBER,
|
|
V_SERIE IN RAW,
|
|
V_DATAORA IN DATE) return varchar2;
|
|
|
|
function decripteaza_nr_util(V_SERIEC IN VARCHAR2) return number;
|
|
|
|
function decripteaza_data_val(V_SERIEC IN VARCHAR2, V_ZI IN VARCHAR2)
|
|
return date;
|
|
|
|
function hextodec(V_HEXA IN VARCHAR2) return number;
|
|
|
|
function dectohex(V_NUMAR IN NUMBER) return varchar2;
|
|
|
|
end AUTH_PACK;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- AUTH_PACK Package Body
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PACKAGE BODY "SYS"."AUTH_PACK" is
|
|
-- versiune 2025-01-14-01
|
|
|
|
------------------------------------------------------------------------------
|
|
-- ISTORIC MODIFICARI:
|
|
-- 2025-01-14: Migrare Oracle 10g -> Oracle 21c Express
|
|
-- - Inlocuit DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt cu DBMS_CRYPTO.DECRYPT
|
|
-- - Folosit ENCRYPT_3DES_2KEY (cheie 16 bytes) + CHAIN_CBC + PAD_ZERO
|
|
-- - Modificari in: decripteaza_serie()
|
|
------------------------------------------------------------------------------
|
|
|
|
procedure verifica_program is
|
|
v_program VARCHAR2(256);
|
|
v_modul VARCHAR2(256);
|
|
v_sid NUMBER(16);
|
|
begin
|
|
begin
|
|
SELECT sid, UPPER(TRIM(program)), UPPER(TRIM(module))
|
|
INTO v_sid, v_program, v_modul
|
|
FROM v$session
|
|
WHERE audsid = USERENV('SESSIONID')
|
|
AND audsid != 0
|
|
AND rownum = 1
|
|
AND STATUS <> 'KILLED';
|
|
PINFO('1 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH');
|
|
|
|
IF v_program not in ('ROASTART.EXE',
|
|
'PLSQLDEV.EXE',
|
|
'ROAGEN.EXE',
|
|
'ROASUPORT.EXE',
|
|
'EXPDP.EXE',
|
|
'IMPDP.EXE',
|
|
'APSNET_WP.EXE',
|
|
'W3WP.EXE',
|
|
'RUBY.EXE',
|
|
'SQLPLUS.EXE',
|
|
'TASKS.EXE',
|
|
'VFP9.EXE',
|
|
'ROAEFACTURA.EXE',
|
|
'WEBDEV.WEBSERVER.EXE',
|
|
'ROA2COCACOLA.EXE') and
|
|
user not in ('SYS',
|
|
'SYSTEM',
|
|
'DBSNMP',
|
|
'CTXSYS',
|
|
'MDSYS',
|
|
'DIP',
|
|
'SYSMAN',
|
|
'WMSYS') THEN
|
|
PINFO('2 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH');
|
|
IF v_program <> v_modul THEN
|
|
RAISE_APPLICATION_ERROR(-20000, 'Acces interzis!');
|
|
END IF;
|
|
PINFO('3 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH');
|
|
IF NOT V_PROGRAM LIKE 'ORACLE%' THEN
|
|
auth_pack.verifica_licenta(v_sid, v_program);
|
|
END IF;
|
|
PINFO('4 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH');
|
|
END IF;
|
|
exception
|
|
when NO_DATA_FOUND then
|
|
v_program := Null;
|
|
end;
|
|
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
-- VERIFICA_LICENTA
|
|
-- LA LOGIN IN BAZA DE DATE SE VERIFICA DACA ESTE LICENTA PENTRU PROGRAM, SI PENTRU NUMARUL DE UTILIZATORI PE PROGRAM DUPA IP
|
|
procedure verifica_licenta(v_sid IN NUMBER, v_program IN VARCHAR2) is
|
|
|
|
v_serie VARCHAR2(256);
|
|
v_seriec VARCHAR2(256);
|
|
v_nr_util NUMBER(5);
|
|
v_utilizatori NUMBER(5);
|
|
v_nume_program SYN_NOM_PROGRAME.DENUMIRE%TYPE;
|
|
v_id_program CONTAFIN_ORACLE.NOM_PROGRAME.ID_PROGRAM%TYPE;
|
|
v_dataora DATE;
|
|
v_data_val DATE;
|
|
v_zi VARCHAR2(2);
|
|
|
|
begin
|
|
V_NUME_PROGRAM := TRIM(REPLACE(v_program, '.EXE'));
|
|
begin
|
|
SELECT A.ID_PROGRAM, B.SERIE, B.DATAORA
|
|
INTO V_ID_PROGRAM, V_SERIE, V_DATAORA
|
|
FROM SYN_NOM_PROGRAME A
|
|
LEFT JOIN AUTH_SERII B
|
|
ON A.ID_PROGRAM = B.ID_PROGRAM
|
|
WHERE UPPER(TRIM(A.DENUMIRE)) = V_NUME_PROGRAM
|
|
AND B.STERS = 0;
|
|
|
|
exception
|
|
WHEN NO_DATA_FOUND THEN
|
|
PINFO('1 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH2');
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Nu aveti licenta pentru ' ||
|
|
V_NUME_PROGRAM || '!' || CHR(13) || CHR(10) ||
|
|
' Licenta poate fi introdusa prin programul ROASUPORT!');
|
|
end;
|
|
PINFO('2 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH2');
|
|
v_zi := LPAD(extract(day from v_dataora), 2, '0');
|
|
v_seriec := auth_pack.decripteaza_serie(v_id_program,
|
|
v_serie,
|
|
v_dataora);
|
|
v_utilizatori := auth_pack.decripteaza_nr_util(v_seriec);
|
|
v_data_val := auth_pack.decripteaza_data_val(v_seriec, v_zi);
|
|
|
|
IF v_utilizatori > 0 THEN
|
|
-- numar cate ip-uri (client_info) distincte cu programul v_program sunt conectate
|
|
-- exceptand ip-ul curent
|
|
-- astfel se poate conecta de pe acelasi ip, cu acelasi program de mai multe ori
|
|
-- fara sa conteze la numarul utilizatorilor conectati
|
|
SELECT COUNT(DISTINCT client_info)
|
|
INTO v_nr_util
|
|
FROM v$session
|
|
WHERE UPPER(TRIM(PROGRAM)) = v_program
|
|
AND SID != v_sid
|
|
and status <> 'KILLED'
|
|
and nvl(client_info, 'x') <> sys_context('userenv', 'ip_address');
|
|
|
|
IF v_nr_util >= v_utilizatori THEN
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Ati depasit numarul de licente (' ||
|
|
v_utilizatori || ') pentru programul ' ||
|
|
v_nume_program || ' !' || CHR(13) ||
|
|
CHR(10) ||
|
|
' Licenta poate fi reinnoita prin programul ROASUPORT!');
|
|
END IF;
|
|
ELSE
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Seria introdusa pentru acest program nu este corecta!' ||
|
|
CHR(13) || CHR(10) ||
|
|
' Licenta poate fi modificata prin programul ROASUPORT!');
|
|
END IF;
|
|
PINFO('3 LOGIN ' || V_PROGRAM || ' USER ' || USER, 'SYS.AUTH2');
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
-- VERIFICA_LICENTA_LUNA
|
|
-- LA DESCHIDEREA DE LUNA NOUA SE VERIFICA DACA ESTE LICENTA PENTRU LUNA NOUA (TRIGGER LA INSERT INTO CALENDAR)
|
|
procedure verifica_licenta_luna(v_an IN NUMBER,
|
|
v_luna IN NUMBER,
|
|
v_tip IN NUMBER) is
|
|
|
|
v_serie VARCHAR2(256);
|
|
v_seriec VARCHAR2(256);
|
|
v_nume_program1 SYN_NOM_PROGRAME.DENUMIRE%TYPE := 'ROASTART';
|
|
v_nume_program2 SYN_NOM_PROGRAME.DENUMIRE%TYPE := 'ROASAL';
|
|
v_id_program CONTAFIN_ORACLE.NOM_PROGRAME.ID_PROGRAM%TYPE;
|
|
v_dataora DATE;
|
|
v_data_val DATE;
|
|
v_zi VARCHAR2(2);
|
|
|
|
begin
|
|
begin
|
|
SELECT A.ID_PROGRAM, B.SERIE, B.DATAORA
|
|
INTO V_ID_PROGRAM, V_SERIE, V_DATAORA
|
|
FROM SYN_NOM_PROGRAME A
|
|
LEFT JOIN AUTH_SERII B
|
|
ON A.ID_PROGRAM = B.ID_PROGRAM
|
|
WHERE UPPER(TRIM(A.DENUMIRE)) =
|
|
DECODE(V_TIP, 1, V_NUME_PROGRAM1, 2, V_NUME_PROGRAM2, 'XYZ')
|
|
-- daca parametrul nu e 1 sau 2, atunci trebuie sa dea eroare
|
|
AND B.STERS = 0;
|
|
|
|
exception
|
|
WHEN NO_DATA_FOUND THEN
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Nu aveti licenta pentru deschiderea de luna noua!' ||
|
|
CHR(13) || CHR(10) ||
|
|
' Licenta poate fi introdusa prin programul ROASUPORT!');
|
|
end;
|
|
|
|
v_zi := LPAD(extract(day from v_dataora), 2, '0');
|
|
v_seriec := auth_pack.decripteaza_serie(v_id_program,
|
|
v_serie,
|
|
v_dataora);
|
|
v_data_val := auth_pack.decripteaza_data_val(v_seriec, v_zi);
|
|
|
|
IF v_data_val < TO_DATE(v_an || v_luna, 'YYYYMM') THEN
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Licenta pentru acest program a expirat!' ||
|
|
CHR(13) || CHR(10) ||
|
|
' Licenta poate fi reinnoita prin programul ROASUPORT!');
|
|
END IF;
|
|
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
-- VERIFICA_NUMAR_FIRME
|
|
-- LA CREAREA UNEI FIRME NOI SE VERIFICA DACA SE DEPASESTE NUMARUL DE FIRME DIN LICENTA
|
|
procedure verifica_numar_firme is
|
|
|
|
v_serie VARCHAR2(256);
|
|
v_seriec VARCHAR2(256);
|
|
v_nume_program SYN_NOM_PROGRAME.DENUMIRE%TYPE := 'ROASTART';
|
|
v_id_program CONTAFIN_ORACLE.NOM_PROGRAME.ID_PROGRAM%TYPE;
|
|
v_dataora DATE;
|
|
V_NR_MAX_FIRME NUMBER(10) := 0;
|
|
V_NR_FIRME NUMBER(10) := 0;
|
|
|
|
begin
|
|
begin
|
|
SELECT A.ID_PROGRAM, B.SERIE, B.DATAORA
|
|
INTO V_ID_PROGRAM, V_SERIE, V_DATAORA
|
|
FROM SYN_NOM_PROGRAME A
|
|
LEFT JOIN AUTH_SERII B
|
|
ON A.ID_PROGRAM = B.ID_PROGRAM
|
|
WHERE UPPER(TRIM(A.DENUMIRE)) = V_NUME_PROGRAM
|
|
AND B.STERS = 0;
|
|
|
|
exception
|
|
WHEN NO_DATA_FOUND THEN
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Nu aveti licenta pentru deschiderea unei firme noi!' ||
|
|
CHR(13) || CHR(10) ||
|
|
' Licenta poate fi introdusa prin programul ROASUPORT!');
|
|
end;
|
|
|
|
v_seriec := auth_pack.decripteaza_serie(v_id_program,
|
|
v_serie,
|
|
v_dataora);
|
|
V_NR_MAX_FIRME := auth_pack.decripteaza_nr_util(V_SERIEC);
|
|
|
|
SELECT COUNT(*)
|
|
INTO V_NR_FIRME
|
|
FROM SYN_NOM_FIRME
|
|
WHERE STERS = 0
|
|
AND NVL(ID_MAMA, 0) = 0;
|
|
|
|
IF V_NR_FIRME >= V_NR_MAX_FIRME THEN
|
|
RAISE_APPLICATION_ERROR(-20000,
|
|
'Aveti licenta pentru maxim ' ||
|
|
V_NR_MAX_FIRME || ' firme (' || V_NR_FIRME ||
|
|
' firme deja definite)!' || CHR(13) ||
|
|
CHR(10) ||
|
|
' Licenta poate fi introdusa prin programul ROASUPORT!');
|
|
END IF;
|
|
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
procedure adauga_serie(V_ID_PROGRAM IN NUMBER,
|
|
V_SERIE IN VARCHAR2,
|
|
V_ID_UTILAD IN NUMBER) is
|
|
V_ID_SERIE AUTH_SERII.ID_SERIE%TYPE;
|
|
V_SERIER AUTH_SERII.SERIE%TYPE;
|
|
eroare_de_conversie EXCEPTION;
|
|
PRAGMA EXCEPTION_INIT(eroare_de_conversie, -6502);
|
|
begin
|
|
BEGIN
|
|
V_SERIER := HEXTORAW(V_SERIE);
|
|
EXCEPTION
|
|
WHEN eroare_de_conversie THEN
|
|
RAISE_APPLICATION_ERROR(-20000, 'Aceasta serie nu este valida!');
|
|
END;
|
|
|
|
auth_pack.verifica_serie(V_ID_PROGRAM, V_SERIER);
|
|
|
|
SELECT SEQ_AUTH_SERII.NEXTVAL INTO V_ID_SERIE FROM DUAL;
|
|
|
|
INSERT INTO AUTH_SERII
|
|
(ID_SERIE, ID_PROGRAM, SERIE, ID_UTIL)
|
|
VALUES
|
|
(V_ID_SERIE, V_ID_PROGRAM, V_SERIER, V_ID_UTILAD);
|
|
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
procedure sterge_serie(V_ID_PROGRAM IN NUMBER, V_ID_UTILS IN NUMBER) is
|
|
begin
|
|
UPDATE AUTH_SERII
|
|
SET STERS = 1, ID_UTILS = V_ID_UTILS, DATAORAS = SYSDATE
|
|
WHERE ID_PROGRAM = V_ID_PROGRAM
|
|
AND STERS = 0;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function selecteaza_serie(V_ID_PROGRAM IN NUMBER) return varchar2 is
|
|
V_SERIE AUTH_SERII.SERIE%TYPE;
|
|
V_SERIEC VARCHAR2(256);
|
|
eroare_de_conversie EXCEPTION;
|
|
PRAGMA EXCEPTION_INIT(eroare_de_conversie, -6502);
|
|
begin
|
|
begin
|
|
SELECT SERIE
|
|
INTO V_SERIE
|
|
FROM AUTH_SERII
|
|
WHERE ID_PROGRAM = V_ID_PROGRAM
|
|
AND STERS = 0;
|
|
exception
|
|
when NO_DATA_FOUND then
|
|
V_SERIE := NULL;
|
|
end;
|
|
|
|
BEGIN
|
|
V_SERIEC := TRIM(RAWTOHEX(V_SERIE));
|
|
EXCEPTION
|
|
WHEN eroare_de_conversie THEN
|
|
V_SERIEC := NULL;
|
|
END;
|
|
|
|
return V_SERIEC;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function selecteaza_nr_util(V_ID_PROGRAM IN NUMBER) return number is
|
|
V_SERIE AUTH_SERII.SERIE%TYPE;
|
|
V_DATAORA DATE;
|
|
V_NR_UTILIZATORI NUMBER(4);
|
|
V_SERIEC VARCHAR2(64);
|
|
begin
|
|
begin
|
|
SELECT SERIE, DATAORA
|
|
INTO V_SERIE, V_DATAORA
|
|
FROM AUTH_SERII
|
|
WHERE ID_PROGRAM = V_ID_PROGRAM
|
|
AND STERS = 0;
|
|
|
|
V_SERIEC := auth_pack.decripteaza_serie(V_ID_PROGRAM,
|
|
V_SERIE,
|
|
V_DATAORA);
|
|
|
|
V_NR_UTILIZATORI := auth_pack.decripteaza_nr_util(V_SERIEC);
|
|
|
|
exception
|
|
when NO_DATA_FOUND then
|
|
V_NR_UTILIZATORI := 0;
|
|
end;
|
|
|
|
return V_NR_UTILIZATORI;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function selecteaza_data_val(V_ID_PROGRAM IN NUMBER) return date is
|
|
V_SERIE AUTH_SERII.SERIE%TYPE;
|
|
V_DATAORA DATE;
|
|
V_DATA_VAL DATE;
|
|
V_SERIEC VARCHAR2(64);
|
|
V_ZI VARCHAR2(2);
|
|
begin
|
|
begin
|
|
|
|
SELECT SERIE, DATAORA
|
|
INTO V_SERIE, V_DATAORA
|
|
FROM AUTH_SERII
|
|
WHERE ID_PROGRAM = V_ID_PROGRAM
|
|
AND STERS = 0;
|
|
|
|
V_SERIEC := auth_pack.decripteaza_serie(V_ID_PROGRAM,
|
|
V_SERIE,
|
|
V_DATAORA);
|
|
V_ZI := LPAD(EXTRACT(DAY FROM V_DATAORA), 2, '0');
|
|
V_DATA_VAL := auth_pack.decripteaza_data_val(V_SERIEC, V_ZI);
|
|
|
|
exception
|
|
when NO_DATA_FOUND then
|
|
V_DATA_VAL := NULL;
|
|
end;
|
|
|
|
return V_DATA_VAL;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
procedure verifica_serie(V_ID_PROGRAM IN NUMBER, V_SERIE IN RAW) is
|
|
v_seriedec VARCHAR2(256);
|
|
v_checksum NUMBER(2);
|
|
v_suma NUMBER(2) := 0;
|
|
begin
|
|
v_seriedec := auth_pack.decripteaza_serie(V_ID_PROGRAM,
|
|
V_SERIE,
|
|
SYSDATE);
|
|
|
|
v_checksum := auth_pack.hextodec(substr(v_seriedec,
|
|
length(v_seriedec),
|
|
1));
|
|
for i in 1 .. length(v_seriedec) - 1 loop
|
|
v_suma := v_suma + auth_pack.hextodec(substr(v_seriedec, i, 1));
|
|
end loop;
|
|
|
|
if MOD(v_suma + v_checksum, 16) <> 0 then
|
|
RAISE_APPLICATION_ERROR(-20000, 'Seria introdusa nu este valida!');
|
|
end if;
|
|
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function decripteaza_serie(V_ID_PROGRAM IN NUMBER,
|
|
V_SERIE IN RAW,
|
|
V_DATAORA IN DATE) return varchar2 is
|
|
v_denumire CONTAFIN_ORACLE.NOM_PROGRAME.DENUMIRE%TYPE;
|
|
v_id_client NUMBER(4);
|
|
v_cheie RAW(16);
|
|
v_serieval RAW(256);
|
|
v_seriedec VARCHAR2(32);
|
|
v_valoare NUMBER(2);
|
|
eroare_de_conversie EXCEPTION;
|
|
PRAGMA EXCEPTION_INIT(eroare_de_conversie, -6502);
|
|
begin
|
|
IF V_SERIE IS NOT NULL THEN
|
|
SELECT substr(a.denumire, 4, 5)
|
|
INTO V_DENUMIRE
|
|
FROM SYN_NOM_PROGRAME A
|
|
WHERE A.ID_PROGRAM = V_ID_PROGRAM;
|
|
|
|
SELECT TO_NUMBER(DETALII) INTO V_ID_CLIENT FROM AUTH_DETALII;
|
|
|
|
v_cheie := utl_raw.cast_to_raw(RPAD(LPAD(v_id_program, 3, '0') ||
|
|
LPAD(v_id_client, 4, '0') ||
|
|
RPAD(v_denumire, 5, CHR(4)) ||
|
|
LPAD(to_char(v_dataora, 'IWYY'), 4, '0'),
|
|
16,
|
|
'X'));
|
|
|
|
-- Inlocuit DBMS_OBFUSCATION_TOOLKIT.DES3Decrypt cu DBMS_CRYPTO.DECRYPT
|
|
-- ENCRYPT_3DES_2KEY pentru chei de 16 bytes, PAD_ZERO pentru compatibilitate
|
|
v_serieval := DBMS_CRYPTO.DECRYPT(
|
|
src => v_serie,
|
|
typ => DBMS_CRYPTO.ENCRYPT_3DES_2KEY + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO,
|
|
key => v_cheie
|
|
);
|
|
|
|
begin
|
|
for i in 1 .. length(v_serieval) / 2 loop
|
|
v_valoare := to_number(substr(v_serieval, 2 * i - 1, 2));
|
|
if v_valoare > 40 then
|
|
v_seriedec := v_seriedec || auth_pack.dectohex(v_valoare - 31);
|
|
else
|
|
v_seriedec := v_seriedec || (v_valoare - 30);
|
|
end if;
|
|
end loop;
|
|
exception
|
|
when eroare_de_conversie then
|
|
RAISE_APPLICATION_ERROR(-20100,
|
|
'Seria introdusa nu este valida!');
|
|
end;
|
|
|
|
ELSE
|
|
v_seriedec := NULL;
|
|
END IF;
|
|
|
|
RETURN v_seriedec;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function decripteaza_nr_util(V_SERIEC IN VARCHAR2) return number is
|
|
begin
|
|
IF V_SERIEC IS NOT NULL THEN
|
|
return to_number(substr(v_seriec, 1, 4));
|
|
ELSE
|
|
return 0;
|
|
END IF;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function decripteaza_data_val(V_SERIEC IN VARCHAR2, V_ZI IN VARCHAR2)
|
|
return date is
|
|
v_luna varchar2(2);
|
|
begin
|
|
IF V_SERIEC IS NOT NULL THEN
|
|
v_luna := LPAD(auth_pack.hextodec(substr(v_seriec, 5, 1)), 2, '0');
|
|
return last_day(to_date(v_luna || substr(v_seriec, 6, 2), 'MMYY'));
|
|
ELSE
|
|
return null;
|
|
END IF;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function hextodec(V_HEXA IN VARCHAR2) return number is
|
|
v_numar NUMBER(2);
|
|
begin
|
|
IF ASCII(UPPER(TRIM(V_HEXA))) BETWEEN 48 AND 57 or
|
|
ASCII(UPPER(TRIM(V_HEXA))) BETWEEN 65 AND 70 THEN
|
|
CASE UPPER(TRIM(V_HEXA))
|
|
WHEN 'A' THEN
|
|
v_numar := 10;
|
|
WHEN 'B' THEN
|
|
v_numar := 11;
|
|
WHEN 'C' THEN
|
|
v_numar := 12;
|
|
WHEN 'D' THEN
|
|
v_numar := 13;
|
|
WHEN 'E' THEN
|
|
v_numar := 14;
|
|
WHEN 'F' THEN
|
|
v_numar := 15;
|
|
ELSE
|
|
v_numar := to_number(V_HEXA);
|
|
END CASE;
|
|
ELSE
|
|
RAISE_APPLICATION_ERROR(-20000, 'Caracterul nu este valid!');
|
|
END IF;
|
|
return v_numar;
|
|
end;
|
|
-------------------------------------------------------------------------------------
|
|
function dectohex(V_NUMAR IN NUMBER) return varchar2 is
|
|
v_hexa VARCHAR2(1);
|
|
begin
|
|
CASE v_numar
|
|
WHEN 10 THEN
|
|
v_hexa := 'A';
|
|
WHEN 11 THEN
|
|
v_hexa := 'B';
|
|
WHEN 12 THEN
|
|
v_hexa := 'C';
|
|
WHEN 13 THEN
|
|
v_hexa := 'D';
|
|
WHEN 14 THEN
|
|
v_hexa := 'E';
|
|
WHEN 15 THEN
|
|
v_hexa := 'F';
|
|
ELSE
|
|
v_hexa := to_char(V_NUMAR);
|
|
END CASE;
|
|
return v_hexa;
|
|
end;
|
|
|
|
end AUTH_PACK;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- PINFO Procedure (wrapped)
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "SYS"."PINFO" wrapped
|
|
a000000
|
|
b2
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
7
|
|
d3 e7
|
|
upTW3dK2OWquAE9qYLTPkR2RYpwwgy7cmJ5qfHSKimRQCVrK0lt6JkrTw376tMBrXqprtSRs
|
|
3F59wMZSKNEfsiHE5qU4k/VLyE0GHVQOHroHCu1lLnCoJ2cL5HuwV1l13q9vshqVV+HqW8iZ
|
|
4r37EyYRJSuaK2nFOQuUu7mgwop/p/KVn2UAnzh9V6+tJBW2C4yS2jO/C9ISABHyfhn3R8gS
|
|
6w/fw6l4/Q==
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- NEWSCHEMA Procedure
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "SYS"."NEWSCHEMA" (tcSchema varchar2,
|
|
tnLuna number,
|
|
tnAn number) is
|
|
lcCommand varchar2(1000);
|
|
|
|
lcSchemaSursa VARCHAR2(100) := 'FIRMANOUA';
|
|
lcSchemaDestinatie VARCHAR2(100) := tcSchema;
|
|
lcDumpFile VARCHAR2(100);
|
|
lcDumpDir VARCHAR2(100) := 'DMPDIR';
|
|
-- lnCount number(10);
|
|
|
|
lcSql varchar2(1000);
|
|
lnAn number := tnAn;
|
|
lnLuna number := tnLuna;
|
|
ldDataI date;
|
|
ldDataF date;
|
|
lnZileLucratoare number(10) := 0;
|
|
lnOreLucratoare number(10) := 0;
|
|
lnMaxAn number(10);
|
|
lcLocatie varchar2(100) := 'CREARE FIRMA ' || tcSchema;
|
|
|
|
h1 NUMBER; -- Data Pump job handle
|
|
ind NUMBER; -- Loop index
|
|
percent_done NUMBER; -- Percentage of job complete
|
|
job_state VARCHAR2(30); -- To keep track of job state
|
|
le ku$_LogEntry; -- For WIP and error messages
|
|
js ku$_JobStatus; -- The job status from get_status
|
|
-- jd ku$_JobDesc; -- The job description from get_status
|
|
sts ku$_Status; -- The status object returned by get_status
|
|
begin
|
|
------------------------------------------------------------------------
|
|
-- CREATE THE USER
|
|
------------------------------------------------------------------------
|
|
/* SELECT COUNT(1)
|
|
INTO lnCount
|
|
FROM dba_users
|
|
WHERE username = UPPER(tcSchema);
|
|
|
|
IF lnCount <> 0 THEN
|
|
EXECUTE IMMEDIATE ('DROP USER ' || tcSchema || ' CASCADE');
|
|
END IF;*/
|
|
|
|
lcCommand := 'create user ' || tcSchema || ' identified by ' || CASE
|
|
WHEN upper(tcSchema) like 'TEST%' THEN
|
|
'"123"'
|
|
ELSE
|
|
'ROMFASTSOFT'
|
|
END || ' default tablespace ROA
|
|
temporary tablespace TEMP
|
|
profile DEFAULT';
|
|
pinfo(lcCommand, lcLocatie);
|
|
execute immediate lcCommand;
|
|
|
|
------------------------------------------------------------------------
|
|
-- GRANT PRIVILEGIES
|
|
------------------------------------------------------------------------
|
|
lcCommand := 'grant connect to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant resource to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create materialized view to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create procedure to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create sequence to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create table to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create trigger to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create type to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant create view to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant debug connect session to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant select any table to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
lcCommand := 'grant unlimited tablespace to ' || tcSchema;
|
|
execute immediate lcCommand;
|
|
|
|
------------------------------------------------------------------------
|
|
-- IMPORT DUMP
|
|
------------------------------------------------------------------------
|
|
-- Create a (user-named) Data Pump job to do a "full" import (everything
|
|
-- in the dump file without filtering).
|
|
|
|
lcDumpFile := lcSchemaSursa || '.dmp';
|
|
|
|
-- h1 := DBMS_DATAPUMP.OPEN('IMPORT', 'SCHEMA', NULL, lcSchemaDestinatie);
|
|
h1 := DBMS_DATAPUMP.OPEN('IMPORT', 'SCHEMA', NULL, lcSchemaDestinatie);
|
|
|
|
-- Specify the single dump file for the job (using the handle just returned)
|
|
-- and directory object, which must already be defined and accessible
|
|
-- to the user running this procedure. This is the dump file created by
|
|
-- the export operation in the first example.
|
|
|
|
-- DBMS_DATAPUMP.ADD_FILE(h1, lcDumpFile, lcDumpDir);
|
|
|
|
BEGIN
|
|
PINFO('DBMS_DATAPUMP.ADD_FILE LOG', lcLocatie);
|
|
DBMS_DATAPUMP.ADD_FILE(handle => h1,
|
|
filename => lcSchemaDestinatie || '.log',
|
|
directory => 'DMPDIR',
|
|
filetype => 3);
|
|
|
|
PINFO('DBMS_DATAPUMP.ADD_FILE DMP', lcLocatie);
|
|
DBMS_DATAPUMP.ADD_FILE(handle => h1,
|
|
filename => lcDumpFile,
|
|
directory => lcDumpDir,
|
|
filetype => 1);
|
|
|
|
-- A metadata remap will map all schema objects from HR to BLAKE.
|
|
PINFO('DBMS_DATAPUMP.METADATA_REMAP', lcLocatie);
|
|
DBMS_DATAPUMP.METADATA_REMAP(h1,
|
|
'REMAP_SCHEMA',
|
|
lcSchemaSursa,
|
|
lcSchemaDestinatie);
|
|
|
|
-- If a table already exists in the destination schema, skip it (leave
|
|
-- the preexisting table alone). This is the default, but it does not hurt
|
|
-- to specify it explicitly.
|
|
|
|
DBMS_DATAPUMP.SET_PARAMETER(h1, 'TABLE_EXISTS_ACTION', 'SKIP');
|
|
|
|
-- Start the job. An exception is returned if something is not set up properly.
|
|
|
|
PINFO('DBMS_DATAPUMP.START_JOB', lcLocatie);
|
|
DBMS_DATAPUMP.START_JOB(h1);
|
|
|
|
------------------------------------------------------------------------
|
|
-- The import job should now be running. In the following loop, the job is
|
|
-- monitored until it completes. In the meantime, progress information is
|
|
-- displayed. Note: this is identical to the export example.
|
|
|
|
percent_done := 0;
|
|
job_state := 'UNDEFINED';
|
|
while (job_state != 'COMPLETED') and (job_state != 'STOPPED') loop
|
|
dbms_datapump.get_status(h1,
|
|
dbms_datapump.ku$_status_job_error +
|
|
dbms_datapump.ku$_status_job_status +
|
|
dbms_datapump.ku$_status_wip,
|
|
-1,
|
|
job_state,
|
|
sts);
|
|
js := sts.job_status;
|
|
|
|
-- If the percentage done changed, display the new value.
|
|
|
|
if js.percent_done != percent_done then
|
|
pinfo('*** Job percent done = ' || to_char(js.percent_done),
|
|
lcLocatie);
|
|
percent_done := js.percent_done;
|
|
end if;
|
|
|
|
-- If any work-in-progress (WIP) or Error messages were received for the job,
|
|
-- display them.
|
|
|
|
if (bitand(sts.mask, dbms_datapump.ku$_status_wip) != 0) then
|
|
le := sts.wip;
|
|
else
|
|
if (bitand(sts.mask, dbms_datapump.ku$_status_job_error) != 0) then
|
|
le := sts.error;
|
|
else
|
|
le := null;
|
|
end if;
|
|
end if;
|
|
if le is not null then
|
|
ind := le.FIRST;
|
|
while ind is not null loop
|
|
-- dbms_output.put_line(le(ind).LogText);
|
|
pinfo(le(ind).LogText, lcLocatie);
|
|
ind := le.NEXT(ind);
|
|
end loop;
|
|
end if;
|
|
end loop;
|
|
|
|
-- Indicate that the job finished and gracefully detach from it.
|
|
-- dbms_output.put_line('Job has completed');
|
|
pinfo('Job has completed', lcLocatie);
|
|
|
|
-- dbms_output.put_line('Final job state = ' || job_state);
|
|
pinfo('Final job state = ' || job_state,
|
|
'CREARE FIRMA ' || lcSchemaDestinatie);
|
|
|
|
------------------------------------------------------------------------
|
|
-- POST IMPORT
|
|
|
|
-- 1. actualizare calendar, sal_calendar, cote_tva
|
|
-- CALENDAR
|
|
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
|
'.CALENDAR SET ANUL = :1, LUNA = :2, AN = TO_CHAR(:3), NL = LPAD(:4, 2, ''0'')';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
USING lnAn, lnLuna, lnAn, lnLuna;
|
|
|
|
-- SAL_CALENDAR
|
|
ldDataI := TO_DATE(lpad(lnAn, 4, '0') || lpad(lnLuna, 2, '0'), 'YYYYMM');
|
|
ldDataF := ADD_MONTHS(ldDataI, 1) - 1;
|
|
lcSql := 'select ' || lcSchemaDestinatie ||
|
|
'.pack_personal.calculeaza_nr_zile(:1, :2) FROM DUAL';
|
|
EXECUTE IMMEDIATE lcSql
|
|
INTO lnZileLucratoare
|
|
USING ldDataI, ldDataF;
|
|
lnOreLucratoare := lnZileLucratoare * 8;
|
|
|
|
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
|
'.SAL_CALENDAR SET AN = :1 , LUNA = :2, ZILELUC = :3, ORESTAS = :4, ORELUC = :5';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
USING lnAn, lnLuna, lnZileLucratoare, lnOreLucratoare, lnOreLucratoare;
|
|
|
|
-- SAL_IMPOZITAR
|
|
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
|
'.SAL_IMPOZITAR SET AN = :1 , LUNA = :2';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
USING lnAn, lnLuna;
|
|
|
|
-- PLCONT
|
|
lcSql := 'SELECT max(an) as plan from ' || lcSchemaDestinatie ||
|
|
'.PLCONT';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
into lnMaxAn;
|
|
if lnMaxAn <> lnAn then
|
|
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
|
'.PLCONT SET AN = :1 WHERE AN = :2';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
USING lnAn, lnMaxAn;
|
|
end if;
|
|
|
|
-- COTE_TVA
|
|
lcSql := 'SELECT max(an*12+luna) from ' || lcSchemaDestinatie ||
|
|
'.cote_tva';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
into lnMaxAn;
|
|
|
|
lcSql := 'UPDATE ' || lcSchemaDestinatie ||
|
|
'.COTE_TVA SET AN = :1, LUNA = :2 WHERE AN*12+LUNA = :3';
|
|
PINFO(lcSql, lcLocatie);
|
|
EXECUTE IMMEDIATE lcSql
|
|
USING lnAn, lnLuna, lnMaxAn;
|
|
------------------------------------------------------------------------
|
|
-- 2. ACTUALIZARE SCHEMA LA ZI
|
|
PINFO('Actualizare schema la zi...', lcLocatie);
|
|
CONTAFIN_ORACLE.PACK_UPDATE.UpdateROA(tnUpdateApp => 0,
|
|
tnUpdateScripturi => 0,
|
|
tnUpdateDatabase => 1,
|
|
tcSchemaList => tcSchema);
|
|
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
PINFO(SQLERRM, lcLocatie);
|
|
raise_application_error(-20000, SQLERRM);
|
|
END;
|
|
|
|
DBMS_DATAPUMP.DETACH(h1);
|
|
|
|
end NewSchema;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- UPDATESQLPLUS Procedure
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "SYS"."UPDATESQLPLUS" (tcSqlPlusPath in varchar2,
|
|
tcScriptPath in varchar2) as
|
|
lcJobName varchar2(500);
|
|
begin
|
|
lcJobName := 'updateschema_' || to_char(sysdate, 'YYYYMMDDHH24MISS');
|
|
dbms_scheduler.create_job(lcJobName,
|
|
job_action => tcSqlPlusPath,
|
|
number_of_arguments => 2,
|
|
job_type => 'executable',
|
|
enabled => false);
|
|
dbms_scheduler.set_job_argument_value(lcJobName, 1, '/nolog');
|
|
dbms_scheduler.set_job_argument_value(lcJobName, 2, '@' || tcScriptPath);
|
|
dbms_scheduler.enable(lcJobName);
|
|
end;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- NEWSCHEMAJOB Procedure
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "SYS"."NEWSCHEMAJOB" (tcSchema varchar2,
|
|
tnLuna number,
|
|
tnAn number) as
|
|
lcJobName varchar2(500);
|
|
begin
|
|
lcJobName := 'NEWSCHEMA_' || UPPER(tcSchema);
|
|
dbms_scheduler.create_job(job_name => lcJobName,
|
|
job_type => 'STORED_PROCEDURE',
|
|
job_action => 'NEWSCHEMA',
|
|
number_of_arguments => 3,
|
|
enabled => false);
|
|
dbms_scheduler.set_job_argument_value(lcJobName, 1, tcSchema);
|
|
dbms_scheduler.set_job_argument_value(lcJobName, 2, to_char(tnLuna));
|
|
dbms_scheduler.set_job_argument_value(lcJobName, 3, to_char(tnAn));
|
|
dbms_scheduler.enable(lcJobName);
|
|
end NEWSCHEMAJOB;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- EXECUTESCRIPTOS Procedure
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE PROCEDURE "SYS"."EXECUTESCRIPTOS" (tcPowerShellPath in varchar2,
|
|
tcScriptPath in varchar2) as
|
|
lcJobName varchar2(500);
|
|
begin
|
|
lcJobName := 'exec_ps_' || SUBSTR(SYS_GUID(), 1, 8);
|
|
|
|
DBMS_SCHEDULER.CREATE_JOB(
|
|
job_name => lcJobName,
|
|
job_action => tcPowerShellPath,
|
|
number_of_arguments => 4,
|
|
job_type => 'executable',
|
|
enabled => FALSE
|
|
);
|
|
|
|
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 1, '-ExecutionPolicy');
|
|
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 2, 'Bypass');
|
|
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 3, '-File');
|
|
DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(lcJobName, 4, tcScriptPath);
|
|
|
|
DBMS_SCHEDULER.ENABLE(lcJobName);
|
|
end ExecuteScriptOS;
|
|
/
|
|
|
|
-- ============================================================================
|
|
-- NEWSCHEMAPROGRESS Function (wrapped)
|
|
-- ============================================================================
|
|
CREATE OR REPLACE NONEDITIONABLE FUNCTION "SYS"."NEWSCHEMAPROGRESS" wrapped
|
|
a000000
|
|
b2
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
abcd
|
|
8
|
|
252 199
|
|
zxoOlwCbdojcPsGMNEX+7vG4viowgxAJ7UhGfHS5R14whrSDSgcEWXzIxarybpjrYjS1uiG9
|
|
+1zNJlbIu3JK13bwcN6yBEVbLfFgwc0GPkaZbaSp/SMtUbWKq6audu2tqMhrqajFIq/ZxhIj
|
|
RbyhiZKk8frL4h2iwYVP6fEjGunska0ZpjeOvUDdhcOmpt60PCOUWO09fPBTLoV9UZ8FnKRq
|
|
3BnqmzYpNIh3Nmox3IHh7L1+/B3ZdDkRY588x/i3cp95sH4gv78FSbxaXXG7LcR3AbIAWqKn
|
|
yd436mUq5f997PYETavFoaYaFQoUOA1e0g/DynVjNWxPRq56JQnrwP+a0i9dmz3se/CgF7o5
|
|
DdffGzEed6v0ceFecZNDvJKMnbz6AfnkKnMFeISf8Mw=
|
|
/
|