| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- SQL Language Extension: EXECUTE STATEMENT
- Implements capability to take a string which is a valid dynamic SQL
- statement and execute it as if it had been submitted to DSQL.
- Available in triggers and stored procedures.
- Author:
- Alex Peshkoff <[email protected]>
- Syntax may have three forms.
- Syntax 1
- ========
- EXECUTE STATEMENT <string>;
- Description
- Executes <string> as SQL operation. It should not return any data rows.
- Following types of SQL operators may be executed:
- * Insert, Delete and Update.
- * Execute Procedure.
- * Any DDL (except Create/Drop Database).
- Sample:
- CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
- AS
- DECLARE VARIABLE Sql VARCHAR(1024);
- DECLARE VARIABLE Par INT;
- BEGIN
- SELECT MIN(SomeField) FROM SomeTable INTO :Par;
- Sql = 'EXECUTE PROCEDURE ' || Pname || '(';
- Sql = Sql || CAST(Par AS VARCHAR(20)) || ')';
- EXECUTE STATEMENT Sql;
- END
- Syntax 2
- =========
- EXECUTE STATEMENT <string> INTO :var1, ., :varn;
- Description
- Executes <string> as SQL operation, returning single data row. Only
- singleton SELECT operators may be executed with this form of EXECUTE
- STATEMENT.
- Sample:
- CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
- AS
- DECLARE VARIABLE Par INT;
- BEGIN
- EXECUTE STATEMENT 'SELECT MAX(CheckField) FROM ' || TableName INTO :Par;
- IF (Par > 100) THEN
- EXCEPTION Ex_Overflow 'Overflow in ' || TableName;
- END
- Syntax 3
- ========
- FOR EXECUTE STATEMENT <string> INTO :var1, ., :varn DO
- <compound-statement>;
- Description
- Executes <string> as SQL operation, returning multiple data rows. Any SELECT
- operator may be executed with this form of EXECUTE STATEMENT.
- Sample:
- CREATE PROCEDURE DynamicSampleThree (TextField VARCHAR(100), TableName VARCHAR(100))
- RETURNING_VALUES (Line VARCHAR(32000))
- AS
- DECLARE VARIABLE OneLine VARCHAR(100);
- BEGIN
- Line = '';
- FOR EXECUTE STATEMENT 'SELECT ' || TextField || ' FROM ' || TableName
- INTO :OneLine
- DO
- IF (OneLine IS NOT NULL) THEN
- Line = Line || OneLine || ' ';
- SUSPEND;
- END
- N O T E S
- =========
- I. For all forms of EXECUTE STATEMENT SQL, the DSQL string can not contain
- any parameters. All variable substitution into the static part of the SQL
- statement should be performed before EXECUTE STATEMENT.
- EXECUTE STATEMENT is potentially dangerous, because:
- 1. At compile time there is no checking for the correctness of the SQL
- statement. No checking of returned values (in syntax forms 2 & 3 )
- can be done.
- 2. There can be no dependency checks to ensure that objects referred to in
- the SQL statement string are not dropped from the database or modified
- in a manner that would break your statement. For example, a DROP TABLE
- request for the table used in the compiled EXECUTE PROCEDURE statement
- will be granted.
- 3. In general, EXECUTE STATEMENT operations are rather slow, because the
- statement to be executed has to be prepared each time it is executed
- by this method.
- These don't mean that you should never use this feature. But, please,
- take into account the given facts and apply a rule of thumb to use
- EXECUTE STATEMENT only when other methods are impossible, or perform even
- worse than EXECUTE STATEMENT.
- To help (a little) with bugfixing, returned values are strictly checked for
- correct datatype. This helps to avoid some errors where unpredictable
- type-casting would otherwise cause exceptions in some conditions but not
- in others. For example, the string '1234' would convert to an int 1234,
- but 'abc' would give a conversion error.
- II. If the stored procedure has special privileges on some objects, the
- dynamic statement submitted in the EXECUTE STATEMENT string does not
- inherit them. Privileges are restricted to those granted to the user who
- is executing the procedure.
|