Oracle | Altibase | Comments |
---|
CREATE OR REPLACE PROCEDURE PROC1(V_EMPNO INTEGER) AS BEGIN EXECUTE IMMEDIATE 'DELETE FROM EMPLOYEES WHERE ENO = :1' USING V_EMPNO; END; / | CREATE OR REPLACE PROCEDURE PROC1(V_EMPNO INTEGER) AS BEGIN EXECUTE IMMEDIATE 'DELETE FROM EMPLOYEES WHERE ENO = ?' USING V_EMPNO; END; / | The placeholder and the question mark are compatible with each other. The corresponding placeholder value should be increased according to the increment of binding parameter count. |
CREATE OR REPLACE PROCEDURE raise_emp_salary (column_value NUMBER, emp_column VARCHAR2, amount NUMBER) IS v_column VARCHAR2(30); sql_stmt VARCHAR2(200); BEGIN -- determine if a valid column name has been given as input SELECT column_name INTO v_column FROM USER_TAB_COLS WHERE TABLE_NAME = 'EMPLOYEES' AND COLUMN_NAME = emp_column; sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE '|| v_column || ' = :2'; EXECUTE IMMEDIATE sql_stmt USING amount, column_value; IF SQL%ROWCOUNT > 0 THEN DBMS_OUTPUT.PUT_LINE('Salaries have been updated for: ' || emp_column|| ' = ' || column_value); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('Invalid Column: ' || emp_column); END raise_emp_salary; / | CREATE OR REPLACE PROCEDURE raise_emp_salary (column_value NUMBER, emp_column VARCHAR2(30), amount NUMBER) IS v_column VARCHAR2(30); sql_stmt VARCHAR2(200); BEGIN -- determine if a valid column name has been given as input SELECT column_name INTO v_column FROM SYSTEM_.SYS_TABLES_ TS, SYSTEM_.SYS_COLUMNS_ CS WHERE TS.USER_ID = CS.USER_ID AND TS.TABLE_ID = CS.TABLE_ID AND TABLE_NAME = 'EMPLOYEES' AND COLUMN_NAME = emp_column; sql_stmt := 'UPDATE employees SET salary = salary + ? WHERE ' || v_column || ' = ?'; EXECUTE IMMEDIATE sql_stmt USING amount, column_value; IF SQL%ROWCOUNT > 0 THEN SYSTEM_.PRINTLN('Salaries have been updated for: ' || emp_column || ' = ' || column_value); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN SYSTEM_.PRINTLN ('Invalid Column: ' || emp_column); END raise_emp_salary; / | Specifying question marks and placeholders in the dynamic SQL variables respectively. |
CREATE OR REPLACE PROCEDURE PROC1 AS plsql_block VARCHAR2(500); new_deptid NUMBER(4); new_dname VARCHAR2(30) := 'Advertising'; new_mgrid NUMBER(6) := 200; new_locid NUMBER(4) := 1700; BEGIN plsql_block := 'BEGIN create_dept(:a, :b, :c, :d); END;'; EXECUTE IMMEDIATE plsql_block USING IN OUT new_deptid, new_dname, new_mgrid, new_locid; END; / | CREATE OR REPLACE PROCEDURE PROC1 AS plsql_block VARCHAR2(500); new_deptid NUMBER(4); new_dname VARCHAR2(30) := 'Advertising'; new_mgrid NUMBER(6) := 200; new_locid NUMBER(4) := 1700; BEGIN plsql_block := 'BEGIN create_dept(:new_deptid, :new_dname, :new_mgrid, :new_locid); END;'; EXECUTE IMMEDIATE plsql_block USING IN OUT new_deptid, new_dname, new_mgrid, new_locid; END; / | Specifying arbitrary(e.g> 1,2,3,4.. a,b,c,d..) parameter is impossible to use in ALTIBASE Stored Procedure. |
CREATE OR REPLACE PROCEDURE fire_employee (emp_id NUMBER) AS BEGIN EXECUTE IMMEDIATE 'DELETE FROM employees WHERE eno = ' || TO_CHAR(emp_id); END; / | CREATE OR REPLACE PROCEDURE fire_employee (emp_id NUMBER) AS BEGIN EXECUTE IMMEDIATE 'DELETE FROM employees WHERE eno = ' || TO_CHAR(emp_id); END; /
| Delivering DML as parameter. |
CREATE PROCEDURE drop_table (table_name IN VARCHAR2) AS BEGIN EXECUTE IMMEDIATE 'DROP TABLE ' || table_name; END; / | CREATE PROCEDURE drop_table (table_name IN VARCHAR2(40)) AS BEGIN EXECUTE IMMEDIATE 'DROP TABLE ' || table_name; END; /
| Delivering DDL as parameter. |
CREATE OR REPLACE PROCEDURE PROC1 AS a NUMBER := 4; b NUMBER := 7; plsql_block VARCHAR2(100); BEGIN plsql_block := 'EXEC calc_stats(:a, :a, :b, :a);'; EXECUTE IMMEDIATE plsql_block USING a, b; END; / | CREATE OR REPLACE PROCEDURE PROC1 AS a NUMBER := 4; b NUMBER := 7; plsql_block VARCHAR2(100); BEGIN plsql_block := 'EXEC calc_stats(:a, :a, :b, :a);'; EXECUTE IMMEDIATE plsql_block USING a, b; END; / | Duplicate parameter name is not supported in ALTIBASE Stored Procedure. You will encounter into [ERR-31248 : Mismatched bind column count 0008 : EXECUTE IMMEDIATE PLSQL_BLOCK USING A, B; ^ ^ ] |
DECLARE BEGIN EXECUTE IMMEDIATE 'DELETE FROM employees WHERE eno > 10'; DBMS_OUTPUT.PUT_LINE('Number of employees deleted: ' || TO_CHAR(SQL%ROWCOUNT)); END; / | CREATE OR REPLACE PROCEDURE PROC1 AS BEGIN EXECUTE IMMEDIATE 'DELETE FROM employees WHERE eno > 10'; SYSTEM_.PRINTLN('Number of employees deleted: ' || TO_CHAR(SQL%ROWCOUNT)); END; / | Using Cursor Attributes with Dynamic SQL |
CREATE OR REPLACE FUNCTION row_count (tab_name VARCHAR2) RETURN NUMBER AS rows NUMBER; BEGIN EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || tab_name INTO rows; RETURN rows; END; / | CREATE OR REPLACE FUNCTION row_count (tab_name VARCHAR2(40)) RETURN NUMBER AS rows NUMBER; BEGIN EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || tab_name INTO rows; RETURN rows; END; / | The conversion of function in Altibase function is almost similar to that of ORACLE PL/SQL. |
CREATE OR REPLACE PROCEDURE PROC1 AS TYPE EmpCurTyp IS REF CURSOR; emp_cv EmpCurTyp; emp_rec employees%ROWTYPE; sql_stmt VARCHAR2(200); v_job VARCHAR2(10) := 'designer'; BEGIN sql_stmt := 'SELECT * FROM employees WHERE emp_job = :j'; OPEN emp_cv FOR sql_stmt USING v_job; LOOP FETCH emp_cv INTO emp_rec; EXIT WHEN emp_cv%NOTFOUND; DBMS_OUTPUT.PUT_LINE('Name: ' || emp_rec.e_lastname || ' Job Id: ' || emp_rec.emp_job); END LOOP; CLOSE emp_cv; END; / | CREATE OR REPLACE PROCEDURE PROC1 AS TYPE EmpCurTyp IS REF CURSOR; emp_cv EmpCurTyp; emp_rec employees%ROWTYPE; sql_stmt VARCHAR2(200); v_job VARCHAR2(10) := 'designer'; BEGIN sql_stmt := 'SELECT * FROM employees WHERE emp_job = :j'; OPEN emp_cv FOR sql_stmt USING v_job; LOOP FETCH emp_cv INTO emp_rec; EXIT WHEN emp_cv%NOTFOUND; SYSTEM_.PRINTLN('Name: ' || emp_rec.e_lastname || ' Job Id: ' ||emp_rec.emp_job); END LOOP; CLOSE emp_cv; END; /
| Dynamic SQL Fetching into a Record |