sqlsybasesap-asesybase-ase15

Workaround for restriction: Another Execute Immediate statement cannot be executed inside an Execute Immediate statement


I understand that SAP ASE has a restriction for nested execute commands.

Because of which the following code shows error:

DROP PROCEDURE sp_proc1

CREATE PROCEDURE sp_proc1
AS
BEGIN
    DECLARE @cmd VARCHAR(20)
    SET @cmd = 'SELECT GETDATE()'
    EXEC (@cmd) 
END

EXEC sp_proc1


DROP PROCEDURE sp_proc2

CREATE PROCEDURE sp_proc2
AS
BEGIN
    DECLARE @cmd VARCHAR(20)
    SET @cmd = 'sp_proc1'
    EXEC (@cmd) 
END

EXEC sp_proc2

Error:

Another Execute Immediate statement cannot be executed inside an Execute Immediate statement., Error 11039, Procedure sp_proc1, Line 6

Here is the actual problem I am trying to solve. Maybe someone can think of a better way to approach it. I have a list of stored procedure names that I have to execute dynamically, this logic is implemented in an initial stored procedure.

Each of these dynamically running stored procedures can contain calls to other stored procedures. These internal stored procedures in turn can also have dynamic statement execution commands. For example, one of these procedures receives the name of a table, queries the fields and data types of the table, elaborates a create statement and creates a copy of the table with the same structure and different name (dummy table).

Because of the restriction, I was forced to make the call of the first stored procedure by using stored procedures that wrap the call from a java class. However, I have problems with the evaluation version of SAP 16 that I use. According to SAP, the version that is available for download from the page contains errors to implement java classes that are corrected with patches (which are not available for free download).

So I am evaluating other options in the way I am implementing this solution.

If you have had a similar problem or any ideas on how to solve it differently I would appreciate your ideas.


Solution

  • From that link in your question re: the execute command, there are 2 different uses of the execute command:

    execute <stored_proc_name>
    
    -- and
    
    execute ( <string> )
    

    And it just so happens that the <stored_proc_name> can be implemented via a @variable, eg:

    declare @procname  varchar(255),
            @arg1      varchar(30)
    
    ---------------
    
    select  @procname = 'sp_help',
            @arg1     = 'sysobjects'
    
    print "########################### %1! %2!", @procname, @arg1
    
    exec @procname @arg1
    
    ---------------
    
    select  @procname = 'sybsystemprocs..sp_help',
            @arg1     = 'sp_helpdb'
    
    print "########################### %1! %2!", @procname, @arg1
    
    exec @procname @arg1
    go
    

    This generates:

    ########################### sp_help sysobjects
    
     Name       Owner Object_type  Object_status Create_date         
     ---------- ----- ------------ ------------- ------------------- 
     sysobjects dbo   system table  -- none --   Jan 23 2016  9:52AM 
    
    (1 row affected)
     Column_name  Type              Length Prec Scale Nulls Not_compressed
    
    ... snip ...
    
    ########################### sybsystemprocs..sp_help sp_helpdb
    
     Name      Owner Object_type      Object_status Create_date         
     --------- ----- ---------------- ------------- ------------------- 
     sp_helpdb dbo   stored procedure  -- none --   Jul 17 2020 12:11PM 
    
    (1 row affected)
     Parameter_name Type    Length Prec Scale Param_order Mode 
     -------------- ------- ------ ---- ----- ----------- ---- 
     @dbname        varchar    255 NULL  NULL           1 in   
     @order         varchar     20 NULL  NULL           2 in   
    (return status = 0)
    

    I don't know the structure of your code but I'm wondering if in your top-level code, instead of running execute ( 'store_proc_name_as_a_string ...' ), you could use execute @store_proc_name ...?