Executing sql in procedure with concatenated command string - sql

I have this here:
create procedure test_ins(IN tab varchar(128))
Language sql
begin
DECLARE stmt_ins STATEMENT;
DECLARE v_query varchar(2048);
DECLARE test varchar(20);
DECLARE test_tab varchar(20);
set test = 'HERE IT IS';
set test_tab = tab;
set v_query= 'INSERT INTO '||test_tab||'(test, free) values (test,'''')';
PREPARE stmt_ins from v_query;
EXECUTE stmt_ins;
end#
The problem is that it seems to run (no error message) but there is nothing in the table....
Any ideas?
Thanks

I think you need to change test to '||test||' in set v_query like below:
create procedure test_ins(IN tab varchar(128))
Language sql
begin
DECLARE stmt_ins STATEMENT;
DECLARE v_query varchar(2048);
DECLARE test varchar(20);
DECLARE test_tab varchar(20);
set test = 'HERE IT IS';
set test_tab = tab;
set v_query= 'INSERT INTO '||test_tab||'(test, free) values ( '''||test||''','''')';
PREPARE stmt_ins from v_query;
EXECUTE stmt_ins;
end#

Seems you are not using a debugger...try the one in IBM Data Studio (free download).
create or replace procedure test_ins(IN tab varchar(128))
Language sql
specific test_ins
begin
DECLARE v_query varchar(2048);
DECLARE test varchar(20);
DECLARE test_tab varchar(20);
DECLARE stmt_ins STATEMENT;
set test = 'HERE IT IS';
set test_tab = tab;
set v_query= 'INSERT INTO '||test_tab||'(test, free) values (''test'','''')';
call dbms_output.put_line(v_query);
PREPARE stmt_ins from v_query;
EXECUTE stmt_ins;
end#

Related

issue with Biguqery Stored procedure

create or replace procedure Practise.sp_test()
OPTIONS(strict_mode=false)
BEGIN
DECLARE v_product_code int64;
DECLARE v_price int64;
set v_product_code = (SELECT product_code FROM `virendra101987.Practise.product` where v_product_code =01);
set v_price = (SELECT price FROM `virendra101987.Practise.product` where v_product_code =01);
EXECUTE IMMEDIATE v_product_code;
EXECUTE IMMEDIATE v_price;
insert into `Practise.sales1`(order_date,product_code,quantity_order,sales_price)
values (current_date(),v_product_code,1,v_price);
END
CALL `virendra101987.Practise.sp_test`();
Why am I getting this error?
ERROR Query error: Cannot coerce expression v_product_code to type STRING at [virendra101987.Practise.sp_test:7:23]
The error message arises from the EXECUTE IMMEDIATE expecting a string. However in looking at what you're trying to achieve I don't believe it is necessary.
The SET operator will execute the SQL statements for you and does not require any further action to evaluate. So you should be able to pass them into your insert statement without issue.
For example:
create or replace procedure Practise.sp_test()
OPTIONS(strict_mode=false)
BEGIN
DECLARE v_product_code int64;
DECLARE v_price int64;
set v_product_code = (SELECT product_code FROM `virendra101987.Practise.product` where v_product_code =01);
set v_price = (SELECT price FROM `virendra101987.Practise.product` where v_product_code =01);
insert into `Practise.sales1`(order_date,product_code,quantity_order,sales_price)
values (current_date(),v_product_code,1,v_price);
END;
CALL `virendra101987.Practise.sp_test`();

Creating a procedure with a call to another procedure in teradata

I have a procedure that returns a list when requested - test_1.
I want to create a procedure that sends each value from a table type_cd_list to the procedure test_1 and returns a list, but I get an error:
An existing result set Cursor is opened from stored procedure
Code:
--calling procedures
CALL Pb_tmd.test_1('280');
--create table
CREATE VOLATILE TABLE type_cd_list
(
num_chn VARCHAR(10),
info_system_type_cd VARCHAR(10)
) ON COMMIT PRESERVE ROWS;
INSERT INTO type_cd_list ('12','280');
--procedure
REPLACE PROCEDURE Pb_tmd.test_2()
DYNAMIC RESULT SETS 1
BEGIN
DECLARE hc1 VARCHAR(10);
FOR
RepordPointer AS c_sptable CURSOR FOR
SELECT info_system_type_cd AS c_c1 FROM type_cd_list
DO
SET hc1 = RepordPointer.c_c1;
CALL Pb_tmd.test_1(:hc1);
END FOR;
ROLLBACK;
END;
Or is there another option to combine these 2 procedures? Below is the nested procedure code
REPLACE PROCEDURE Pb_tmd.test_1 (IN db_lst VARCHAR(100))
DYNAMIC RESULT SETS 1
BEGIN
DECLARE NumberInst VARCHAR(100);
DECLARE SQL_TEXT VARCHAR(3000);
DECLARE cur1 CURSOR WITH RETURN ONLY FOR S1;
SET SQL_TEXT = 'SELECT * FROM Pb_'||db_lst||'_tmd.LOAD_LOG';
PREPARE S1 FROM SQL_TEXT;
OPEN cur1;
END;

db2 dynamic cursor declaration

I am trying to create a stored procedure, but I get this error
Expected tokens may include: "". LINE NUMBER=17. SQLSTATE=42601
My code:
CREATE OR REPLACE PROCEDURE FETCH_EMP_SP(IN V_EMP_NAME VARCHAR(100),IN V_EMP_DEPT VARCHAR(100))
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE p_query_string VARCHAR(100);
IF ((V_EMP_NAME IS NOT NULL) AND (V_EMP_DEPT IS NOT NULL)) THEN
SET p_query_string = 'emp_name ='||V_EMP_NAME||' AND emp_dept='||V_EMP_DEPT||' WITH UR';
ELSEIF(V_EMP_DEPT IS NOT NULL) THEN
SET p_query_string = ' AND emp_dept='||V_EMP_DEPT||' WITH UR';
ELSE
SET p_query_string = ' WITH UR';
END IF;
DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR SELECT emp_name,emp_no,emp_dept,emp_location from employee where status=1 p_query_string;
OPEN C1;
END#
should be executed successfully
Declarations and statements can’t follow in arbitrary order in a Compound SQL (compiled) statement
Cursor declarations must follow the variables declarations and must be followed by the SQL procedure statements.
So, place the cursor declaration after the variable declaration.
Moreover, there is a number of other errors in your code. Should be something like this:
CREATE OR REPLACE PROCEDURE FETCH_EMP_SP(IN V_EMP_NAME VARCHAR(100),IN V_EMP_DEPT VARCHAR(100))
DYNAMIC RESULT SETS 1
LANGUAGE SQL
BEGIN
DECLARE p_query_string VARCHAR(256);
DECLARE C1 CURSOR WITH RETURN TO CLIENT FOR S1;
IF ((V_EMP_NAME IS NOT NULL) AND (V_EMP_DEPT IS NOT NULL)) THEN
SET p_query_string = ' AND emp_name ='''||V_EMP_NAME||''' AND emp_dept='''||V_EMP_DEPT||''' WITH UR';
ELSEIF(V_EMP_DEPT IS NOT NULL) THEN
SET p_query_string = ' AND emp_dept='''||V_EMP_DEPT||''' WITH UR';
ELSE
SET p_query_string = ' WITH UR';
END IF;
SET p_query_string='SELECT emp_name,emp_no,emp_dept,emp_location from employee where status=1 '||p_query_string;
PREPARE S1 FROM p_query_string;
OPEN C1;
END#
String constants in the query text must be wrapped in single quotes. Don't do this if emp_dept is a numeric column.

Two cursors sequence in procedure

I have the following problem with a procedure:
CREATE PROCEDURE TEST()
LANGUAGE SQL
BEGIN
DECLARE V_TEST VARCHAR(100);
DECLARE V_TEST_EXT VARCHAR(100);
DECLARE SQLCODE INTEGER DEFAULT -1;
DECLARE RET_CODE INTEGER DEFAULT -2;
DECLARE LIST_CMD VARCHAR(512);
DECLARE LIST_CMD_EXT VARCHAR(512);
DECLARE CUR_TEST CURSOR WITH RETURN FOR LIST_STMT;
DECLARE CUR_TEST_EXT CURSOR WITH RETURN FOR LIST_EXT_STMT;
DECLARE CONTINUE HANDLER FOR SQLEXECPTION SET RET_CODE = SQLCODE;
SET LIST_CMD = 'SELECT TEST FROM TESTTAB';
PREPARE LIST_STMT FROM LIST_CMD;
OPEN CUR_TEST;
FETCH CUR_TEST INTO V_TEST;
WHILE (RET_CODE <> 100) DO
FETCH CUR_TEST INTO V_TEST;
END WHILE;
CLOSE CUR_TEST;
SET LIST_CMD_EXT = 'SELECT TEST FROM TESTTAB';
PREPARE LIST_STMT_EXT FROM LIST_CMD_EXT;
OPEN CUR_TEST_EXT;
FETCH CUR_TEST_EXT INTO V_TEST_EXT;
WHILE (RET_CODE <> 100) DO
FETCH CUR_TEST_EXT INTO V_TEST_EXT;
END WHILE;
CLOSE CUR_TEST_EXT;
END;
The problem I am having is that the procedure does the first cursor loop but ignores the second one. I tried adding BEGIN and END to each loop but that didn't help as well.
I am running DB2 v10.5 Windows. I need this to work as a procedure. Is there any way to make the procedure run both loops?
Thank you for your help.-
You don't reset the RET_CODE variable before processing the 2-nd cursor.
Use something like this:
SET RET_CODE = 0;
OPEN CUR_TEST_EXT;
...
BTW, don't declare a cursor using 'WITH RETURN' clause if you process this cursor inside the procedure.

While compiling trigger in Oracle SQL throwing error as table or view doesn't exist

Also following error coming near "declare #empsal" as PLS-00103 :Encountered the symbol "#" when expecting one of the following...
My tables do exist in the database.
My trigger:
create or replace
TRIGGER leavemastertrg After INSERT
ON "xyz"."leave_master"
declare #empid int;
declare #empname varchar(100);
declare #empsal decimal(10,2);
declare #audit_action varchar(100);
select #empid=i.LEAVE_ID from inserted i;
select #empname=i.LEAVE_NAME from inserted i;
select #empsal=i.LEAVE_STATUS from inserted i;
set #audit_action='Inserted Record -- After Insert Trigger.';
insert into manager_master
(MANAGER_ID,MANAGER_NAME,MANAGER_STATUS,MANAGER_AUDIT_ACTION,MANAGER_AUDIT_TIMESTAMP)
values(#empid,#empname,#empsal,#audit_action,getdate());
PRINT 'AFTER INSERT trigger fired.'
GO
CREATE OR REPLACE
TRIGGER LM_AFTER_INSERT
AFTER INSERT ON LEAVE_MASTER
FOR EACH ROW
DECLARE
v_username varchar2(20 byte);
BEGIN
SELECT user INTO v_username
FROM dual;
INSERT INTO manager_master
( MANAGER_ID,
MANAGER_NAME,
MANAGER_STATUS,
Modified_by)
VALUES
( :new.LEAVE_ID,
:new.LEAVE_NAME,
:new.LEAVE_STATUS,
user);
END;
This sample code working fine in Oracle SQL.Wrong way i applied Mysql,oralce sql concepts.Thanks to all.