PROC SQL sets up macro variables with certain values after it executes each statement. These macro variables can be tested inside a macro to determine whether to continue executing the PROC SQL step.
After each PROC SQL statement has executed, the following macro variables are updated with these values:
- SQLEXITCODE
-
contains the highest return code that occurred from some types of SQL insert
failures. This return code is written to the SYSERR macro variable when PROC SQL
terminates.
- SQLOBS
-
contains the number of rows that were processed by an SQL procedure
statement. For example, the SQLOBS macro variable contains the number of rows
that were formatted and displayed in SAS output by a SELECT statement or the
number of rows that were deleted by a DELETE statement.
When the NOPRINT option is specified, the value of the SQLOBS macro variable depends on whether an output table, single macro variable, macro variable list, or macro variable range is created:
-
If no output table, macro variable list, or macro variable range is created,
then SQLOBS contains the value 1.
-
If an output table is created, then SQLOBS contains the number of rows in the
output table.
-
If a single macro variable is created, then SQLOBS contains the value 1.
- If a macro variable list or macro variable range is created, then SQLOBS contains the number of rows that are processed to create the macro variable list or range.
Note: The SQLOBS automatic macro variable is assigned a value after the SQL SELECT statement executes.
-
If no output table, macro variable list, or macro variable range is created,
then SQLOBS contains the value 1.
- SQLOOPS
-
contains the number of iterations that the inner loop of PROC SQL processes.
The number of iterations increases proportionally with the complexity of the
query. For more information, see Limiting
Iterations with the LOOPS= Option and LOOPS= in the Base SAS Procedures
Guide.
- SQLRC
-
contains the following status values that indicate the success of the SQL
procedure statement:
- 0
-
PROC SQL statement completed successfully with no errors.
- 4
-
PROC SQL statement encountered a situation for which it issued a warning. The
statement continued to execute.
- 8
-
PROC SQL statement encountered an error. The statement stopped execution at
this point.
- 12
-
PROC SQL statement encountered an internal error, indicating a bug in PROC
SQL that should be reported to SAS Technical Support. These errors can occur
only during compile time.
- 16
-
PROC SQL statement encountered a user error. For example, this error code is
used, when a subquery (that can return only a single value) evaluates to more
than one row. These errors can be detected only during run time.
- 24
-
PROC SQL statement encountered a system error. For example, this error is
used, if the system cannot write to a PROC SQL table because the disk is full.
These errors can occur only during run time.
- 28
- PROC SQL statement encountered an internal error, indicating a bug in PROC SQL that should be reported to SAS Technical Support. These errors can occur only during run time.
For example, the values for the SQLRC return code differ based on the value of the UNDO_POLICY= option or the SQLUNDOPOLICY system option if you attempt to insert duplicate values into an index that is defined using the CREATE UNIQUE INDEX statement:
-
If you set the UNDO_POLICY= option or the SQLUNDOPOLICY system option to
either REQUIRED or OPTIONAL, and you attempt to insert a duplicate index value,
SAS creates and tries to maintain a copy of the table before and after updates
are applied. SAS detects an error condition and supplies a return code to PROC
SQL, which stops execution as soon as the error condition is received. SQLRC
contains the value 24.
- If you set the UNDO_POLICY= option or the SQLUNDOPOLICY system option to NONE and you attempt to insert a duplicate index value, SAS does not create a before-and-after copy of the table. SAS does not detect an error condition and does not supply a return code to PROC SQL, which attempts to continue to process the updates. SQLRC contains the value 8.
- SQLXMSG
-
contains descriptive information and the DBMS-specific return code for the
error that is returned by the Pass-Through Facility.
Note: Because the value of the SQLXMSG macro variable can contain special characters (such as &, %, /, *, and ;), use the %SUPERQ macro function when printing the following value:
%put %superq(sqlxmsg);
For information about the %SUPERQ function, see SAS Macro Language: Reference. - SQLXRC
- contains the DBMS-specific return code that is returned by the Pass-Through Facility.
Users of SAS/AF software can access these automatic macro variables in SAS Component Language (SCL) programs by using the SYMGET function. The following example uses the VALIDATE statement in a SAS/AF software application to check the syntax of a block of code. Before it issues the CREATE VIEW statement, the application checks that the view is accessible.
submit sql immediate; validate &viewdef; end submit; if symget('SQLRC') gt 4 then do; ... the view is not valid ... end; else do; submit sql immediate; create view &viewname as &viewdef; end submit; end;
The following example retrieves the data from the COUNTRIES table, but does not display the table because the NOPRINT option is specified in the PROC SQL statement. The %PUT macro language statement displays the three automatic macro variable values in the SAS log. For more information about the %PUT statement and the SAS macro facility, see SAS Macro Language: Reference.
proc sql noprint; select * from sql.countries; %put SQLOBS=*&sqlobs* SQLOOPS=*&sqloops* SQLRC=*&sqlrc*;
Using the PROC SQL Automatic Macro Variables
SQLOBS=*1* SQLOOPS=*11* SQLRC=*0*Notice that the value of SQLOBS is 1. When the NOPRINT option is used and no table or macro variables are created, SQLOBS returns a value of 1 because only one row is processed.
Note: You can use the _AUTOMATIC_ option in the %PUT statement to list the values of all automatic macro variables. The list depends on the SAS products that are installed at your site
Good Post! Thank you so much for sharing this pretty post, it was so good to read and useful to improve my knowledge as updated one, keep blogging…
ReplyDeleteSAS Online Training
Tableau Online Training|
R Programming Online Training|
Along with other technology, the scope of SAP is growing in programming good. It was good information. keep it up!!!
ReplyDeleteAndroid Training in Chennai
Android Online Training in Chennai
Android Training in Bangalore
Android Training in Hyderabad
Android Training in Coimbatore
Android Training
Android Online Training