When using dynamic SQL Host Variables cannot be used within the string, but
parameter markers (?).
The replacement (host) variables for the parameter markers must be
defined/passed with the OPEN statement:

myStatement = 'SELECT CMCSNAME, CMADDR1, CMCITY, CMCST#6, CMCST#3 '
+ 'FROM CUSTML1 '
+ 'WHERE (CMCSNAME>= ?) AND CMCSNAME LIKE '''
+ csgrpkwda + '''' ;
If SHCO# <> 0 ;
myStatement += ' AND (CMSRVCO#=' + %Char(SHCO#) ;
myStmt += ' AND CMDEL<>''D'') '
+ 'ORDER BY CMCSNAME;
Exec SQL PREPARE cursorStmt from :myStatement ;
Exec SQL DECLARE CURSOR C1 FOR cursorStmt ;

Exec SQL Open C1 using :SHCSNAME;

In either way there is no need to use dynamic SQL (see the previous
examples)!
When executing dynamic SQL statement additional steps must be performed at
runtime (i.e. the string containing the SQL statement must be checked and
converted into an executable SQL statement).
The access plans used for dynamic SQL are NOT stored in the program object
(contrary to static SQL). In this way a access plan must be built by scratch
for dynamic SQL. At least if the query is executed by the CQE (classic query
engine) or if it is executed by the SQE (SQL Query Engine) and there is no
access path stored in the SQE Plan cache that can be validated.

Mit freundlichen Grüßen / Best regards

Birgitta Hauser

"Shoot for the moon, even if you miss, you'll land among the stars." (Les
Brown)
"If you think education is expensive, try ignorance." (Derek Bok)
"What is worse than training your staff and losing them? Not training them
and keeping them!"

-----Ursprüngliche Nachricht-----
Von: midrange-l-bounces@xxxxxxxxxxxx
[mailto:midrange-l-bounces@xxxxxxxxxxxx] Im Auftrag von Dennis Lovelady
Gesendet: Friday, 28. October 2011 23:19
An: 'Midrange Systems Technical Discussion'
Betreff: RE: SQL RPG question

If I were doing this, I might do it this way:

D myStatement S 4096 Varying


myStatement = 'SELECT CMCSNAME, CMADDR1, CMCITY, CMCST#6, CMCST#3 '
+ 'FROM CUSTML1 '
+ 'WHERE (CMCSNAME>=:SHCSNAME) AND CMCSNAME LIKE '''
+ csgrpkwda + '''' ;
If SHCO# <> 0 ;
myStatement += ' AND (CMSRVCO#=' + %Char(SHCO#) ;
myStmt += ' AND CMDEL<>''D'') '
+ 'ORDER BY CMCSNAME;
Exec SQL PREPARE cursorStmt from :myStatement ;
Exec SQL DECLARE CURSOR C1 FOR cursorStmt ;

But more likely, I would do:

C/EXEC SQL DECLARE C1 CURSOR FOR
C+ SELECT CMCSNAME, CMADDR1, CMCITY, CMCST#6, CMCST#3 FROM
C+ CUSTML1 WHERE (CMCSNAME>=:SHCSNAME) AND CMCSNAME LIKE
C+ :csgrpkwda AND (:SHCO#=0 OR CMSRVCO#=:SHCO#) and
C+ CMDEL<>'D' ORDER BY CMCSNAME
C/END-EXEC



Dennis Lovelady
http://www.linkedin.com/in/dennislovelady
--
Be careful about reading health books. You may die of a misprint.
-- Mark Twain

Just call your second cursor C2.
Or you could change your SQL statement Where clasue to take into account
your condition.

2.C/EXEC SQL DECLARE C1 CURSOR FOR
3.C+ SELECT CMCSNAME, CMADDR1, CMCITY, CMCST#6, CMCST#3 FROM
4.C+ CUSTML1 WHERE (CMCSNAME>=:SHCSNAME) AND CMCSNAME LIKE
5.C+ :csgrpkwda AND (CASE WHEN :SHC0# <> 0 THEN CMSRVCO#=:SHCO# ELSE END
and
6.C+ CMDEL<>'D') ORDER BY CMCSNAME
7.C/END-EXEC

-Tom Stieger
IT Manager
California Fine Wire

-----Original Message-----
From: midrange-l-bounces@xxxxxxxxxxxx
[mailto:midrange-l-bounces@xxxxxxxxxxxx] On Behalf Of James Rich
Sent: Friday, October 28, 2011 12:05 PM
To: midrange-l
Subject: SQL RPG question

I need to create one of two SQL statements conditionally, but when I try
to compile the source the compiler errors with:

SQL0051 30 289 Position 25 Cursor or procedure C1 previously
declared.

The source I'm working with is at:

http://code.midrange.com/37665d27b6.html

How do I conditionally create these SQL statements?

James Rich

if you want to understand why that is, there are many good books on the
design of operating systems. please pass them along to redmond when
you're done reading them :)
- Paul Davis on ardour-dev
--
This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing
list To post a message email: MIDRANGE-L@xxxxxxxxxxxx To subscribe,
unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/midrange-l
or email: MIDRANGE-L-request@xxxxxxxxxxxx Before posting, please take a
moment to review the archives at http://archive.midrange.com/midrange-l.

--
This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing
list
To post a message email: MIDRANGE-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/midrange-l
or email: MIDRANGE-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/midrange-l.



As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.