By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
432,028 Members | 1,092 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 432,028 IT Pros & Developers. It's quick & easy.

PREPARE stmt FROM stmtText and table names

P: n/a
I wrote a stored procedure that uses a prepared INSERT INTO statement
in order to play with the PREPARE and EXECUTE keywords.

In transcript 1 below the call to that stored procedure does not work.
Yet transcript 2 shows that the stored procedure does its job, if only
the table name is provided directly in the statement text string,
instead of as a host variable to a prepared statement like in 'EXECUTE
stmt USING tabName, fldValue'.

-- transcript 1:

DROP TABLE S00.IT3
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CREATE TABLE S00.IT3 ( id INTEGER )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

DROP PROCEDURE S00.InsertTab3
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CREATE PROCEDURE S00.InsertTab3 ( IN tabName VARCHAR(128), IN fldValue
INTEGER )
LANGUAGE SQL
DETERMINISTIC
BEGIN

DECLARE fldValue2 INTEGER ;
DECLARE fldValue3 INTEGER ;
DECLARE stmtText VARCHAR(256);
DECLARE stmt STATEMENT ;

SET stmtText = 'INSERT INTO ? VALUES ( ? )';
PREPARE stmt FROM stmtText ;

SET fldValue2 = fldValue + 1 ;
SET fldValue3 = fldValue + 2 ;

EXECUTE stmt USING tabName, fldValue ;
EXECUTE stmt USING tabName, fldValue2 ;
EXECUTE stmt USING tabName, fldValue3 ;

END

DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CALL S00.InsertTab3( 'S00.IT3', 42 )
SQL0104N Auf "INSERT INTO " folgte das unerwartete Token "?". Zu den
möglichen Token gehören: "<insert_target>". SQLSTATE=42601

SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------

0 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
-

1 Satz/Sätze ausgewählt.
INSERT INTO S00.IT3 VALUES ( 100 )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------
100

1 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
100

1 Satz/Sätze ausgewählt.
-- transcript 2:

DROP TABLE S00.IT3
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CREATE TABLE S00.IT3 ( id INTEGER )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

DROP PROCEDURE S00.InsertTab3
DB21034E Der Befehl wurde als SQL-Anweisung verarbeitet, da es sich um
keinen
gültigen Befehl des Befehlszeilenprozessors handelte. Während der
SQL-Verarbeitung wurde Folgendes ausgegeben:
SQL0204N "S00.INSERTTAB3" ist ein nicht definierter Name.
SQLSTATE=42704

CREATE PROCEDURE S00.InsertTab3 ( IN tabName VARCHAR(128), IN fldValue
INTEGER )
LANGUAGE SQL
DETERMINISTIC
BEGIN
DECLARE fldValue2 INTEGER ;
DECLARE fldValue3 INTEGER ;
DECLARE stmtText VARCHAR(256);
DECLARE stmt STATEMENT ;
SET stmtText = 'INSERT INTO S00.IT3 VALUES ( ? )';
PREPARE stmt FROM stmtText ;
SET fldValue2 = fldValue + 1 ;
SET fldValue3 = fldValue + 2 ;
EXECUTE stmt USING fldValue ;
EXECUTE stmt USING fldValue2 ; -- note fldValue + 1 would not work
EXECUTE stmt USING fldValue3 ; -- note fldValue + 2 would not work
END

DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CALL S00.InsertTab3( 'S00.IT3', 42 )

Rückgabestatus = 0
SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------
44
43
42

3 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
129

1 Satz/Sätze ausgewählt.
INSERT INTO S00.IT3 VALUES ( 100 )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------
100
44
43
42

4 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
229

1 Satz/Sätze ausgewählt.

Nov 12 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a

claus.hi...@abraxas.ch napisal(a):
I wrote a stored procedure that uses a prepared INSERT INTO statement
in order to play with the PREPARE and EXECUTE keywords.

In transcript 1 below the call to that stored procedure does not work.
Yet transcript 2 shows that the stored procedure does its job, if only
the table name is provided directly in the statement text string,
instead of as a host variable to a prepared statement like in 'EXECUTE
stmt USING tabName, fldValue'.

-- transcript 1:

DROP TABLE S00.IT3
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CREATE TABLE S00.IT3 ( id INTEGER )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

DROP PROCEDURE S00.InsertTab3
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CREATE PROCEDURE S00.InsertTab3 ( IN tabName VARCHAR(128), IN fldValue
INTEGER )
LANGUAGE SQL
DETERMINISTIC
BEGIN

DECLARE fldValue2 INTEGER ;
DECLARE fldValue3 INTEGER ;
DECLARE stmtText VARCHAR(256);
DECLARE stmt STATEMENT ;

SET stmtText = 'INSERT INTO ? VALUES ( ? )';
PREPARE stmt FROM stmtText ;

SET fldValue2 = fldValue + 1 ;
SET fldValue3 = fldValue + 2 ;

EXECUTE stmt USING tabName, fldValue ;
EXECUTE stmt USING tabName, fldValue2 ;
EXECUTE stmt USING tabName, fldValue3 ;

END

DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CALL S00.InsertTab3( 'S00.IT3', 42 )
SQL0104N Auf "INSERT INTO " folgte das unerwartete Token "?". Zu den
möglichen Token gehören: "<insert_target>". SQLSTATE=42601

SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------

0 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
-

1 Satz/Sätze ausgewählt.
INSERT INTO S00.IT3 VALUES ( 100 )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------
100

1 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
100

1 Satz/Sätze ausgewählt.
-- transcript 2:

DROP TABLE S00.IT3
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CREATE TABLE S00.IT3 ( id INTEGER )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

DROP PROCEDURE S00.InsertTab3
DB21034E Der Befehl wurde als SQL-Anweisung verarbeitet, da es sich um
keinen
gültigen Befehl des Befehlszeilenprozessors handelte. Während der
SQL-Verarbeitung wurde Folgendes ausgegeben:
SQL0204N "S00.INSERTTAB3" ist ein nicht definierter Name.
SQLSTATE=42704

CREATE PROCEDURE S00.InsertTab3 ( IN tabName VARCHAR(128), IN fldValue
INTEGER )
LANGUAGE SQL
DETERMINISTIC
BEGIN
DECLARE fldValue2 INTEGER ;
DECLARE fldValue3 INTEGER ;
DECLARE stmtText VARCHAR(256);
DECLARE stmt STATEMENT ;
SET stmtText = 'INSERT INTO S00.IT3 VALUES ( ? )';
PREPARE stmt FROM stmtText ;
SET fldValue2 = fldValue + 1 ;
SET fldValue3 = fldValue + 2 ;
EXECUTE stmt USING fldValue ;
EXECUTE stmt USING fldValue2 ; -- note fldValue + 1 would not work
EXECUTE stmt USING fldValue3 ; -- note fldValue + 2 would not work
END

DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

CALL S00.InsertTab3( 'S00.IT3', 42 )

Rückgabestatus = 0
SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------
44
43
42

3 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
129

1 Satz/Sätze ausgewählt.
INSERT INTO S00.IT3 VALUES ( 100 )
DB20000I Der Befehl SQL wurde erfolgreich ausgeführt.

SELECT ID FROM S00.IT3 ORDER BY ID DESC

ID
-----------
100
44
43
42

4 Satz/Sätze ausgewählt.
SELECT SUM(ID) FROM S00.IT3

1
-----------
229

1 Satz/Sätze ausgewählt.

This is normal behavior, because table name is not a host variable and
for that simply cannot be a parameter marker. Use concatenation to
build SQL statement.

CREATE PROCEDURE S00.InsertTab3 ( IN tabName VARCHAR(128), IN fldValue
INTEGER )
LANGUAGE SQL
DETERMINISTIC
BEGIN

DECLARE fldValue2 INTEGER ;
DECLARE fldValue3 INTEGER ;
DECLARE stmtText VARCHAR(256);
DECLARE stmt STATEMENT ;

SET stmtText = 'INSERT INTO '||tabName||' VALUES ( ? )';
PREPARE stmt FROM stmtText ;

SET fldValue2 = fldValue + 1 ;
SET fldValue3 = fldValue + 2 ;

EXECUTE stmt USING fldValue ;
EXECUTE stmt USING fldValue2 ;
EXECUTE stmt USING fldValue3 ;

END

Cheers
Adrian

Nov 12 '05 #2

P: n/a
Thank you, Adrian, now I see.

Thinking about it again it is really natural behavior: I prepare the
INSERT statement to insert N times into the same table. If I didn't
want the table to be constant across those N invocations, there would
be no reason to prepare the statement in the first place.

Nov 12 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.