Using the SAS_PUT( ) Function in the Aster Database

Overview of the SAS_PUT( ) Function

The SAS_PUT( ) function executes the format files using the SAS Embedded Process in Aster. The SAS_PUT( ) function is installed in the NC_INSTALLED_FILES table under the PUBLIC schema. For more information, see the SAS In-Database Products: Administrator’s Guide.
The SAS_PUT( ) function is available to use in the SELECT clause in any SQL expression in the same way that Aster SQL/MR functions are used.
This is the syntax of the SAS_PUT( ) function.
SELECT SAS_PUT(value , 'fmtname' ) FROM input-table;
Arguments

value

specifies the name of the value that the format is applied to.

fmtname

specifies the name of the format.

input-table

specifies the input table that is used by the SAS_PUT( ) function.

Implicit Use of the SAS_PUT( ) Function

Mapping PUT Function Calls to SAS_PUT( )

After you install the SAS_PUT( ) function and formats that SAS supplies in libraries inside the Aster database, and after you publish any custom format definitions that you created in SAS, you can access the SAS_PUT( ) function with your SQL queries.
If the SQLMAPPUTTO= system option is set to SAS_PUT and you submit your program from a SAS session, the SAS SQL processor maps PUT function calls to SAS_PUT( ) function references that Aster understands.
This example illustrates how the PUT function is mapped to the SAS_PUT( ) function using implicit pass-through. The SELECT DISTINCT clause executes inside Aster, and the processing is distributed across all available data nodes. Aster formats the price values with the $DOLLAR8.2 format and processes the SELECT DISTINCT clause using the formatted values.
options sqlmapputto=sas_put;

libname dblib aster user="sas" password="sas" server="sl96208"
   database=sas connection=shared;

   /*-- Set SQL debug global options --*/
   /*----------------------------------*/
   options sastrace=',,,d' sastraceloc=saslog;

   /*-- Execute SQL using Implicit Passthru --*/
   /*-----------------------------------------*/
   proc sql noerrorstop;
      title1 'Test SAS_PUT using Implicit Passthru ';
      select distinct
         PUT(PRICE,Dollar8.2) AS PRICE_C
            from dblib.mailorderdemo;
   quit;
These lines are written to the SAS log.
libname dblib aster user="sas" password="sas" server="sl96208"
   database=sas connection=shared;

NOTE: Libref DBLIB was successfully assigned, as follows:
      Engine:        ASTER
      Physical Name: sl96208

         /*-- Set SQL debug global options --*/
         /*----------------------------------*/
         options sastrace=',,,d' sastraceloc=saslog;

         /*-- Execute SQL using Implicit Passthru --*/
         /*-----------------------------------------*/
         proc sql noerrorstop;
           title1 'Test SAS_PUT using Implicit Passthru ';
           select distinct
              PUT(PRICE,Dollar8.2) AS PRICE_C
            from dblib.mailorderdemo
                ;

ASTER_0: Prepared: on connection 0
SELECT * FROM sas."mailorderdemo"


ASTER_1: Prepared: on connection 0
 select distinct cast(sas_put("sas"."mailorderdemo"."PRICE", 'DOLLAR8.2')
 as char(8)) as "PRICE_C" from "sas"."mailorderdemo"

ASTER: trforc: COMMIT WORK
ACCESS ENGINE:  SQL statement was passed to the DBMS for fetching data.

ASTER_2: Executed: on connection 0
 select distinct cast(sas_put("sas"."mailorderdemo"."PRICE", 'DOLLAR8.2')
 as char(8)) as "PRICE_C" from "sas"."mailorderdemo"

ASTER: trget - rows to fetch: 9
ASTER: trforc: COMMIT WORK

               Test SAS_PUT using Implicit Passthru                        9
                                        3:42 Thursday, April 25, 2013

                             PRICE_C
                             _______
                               $8.00
                              $10.00
                              $12.00
                              $13.59
                              $13.99
                              $14.00
                              $27.98
                              $48.99
                              $54.00

         quit;

Considerations with Implicit Use of SAS_PUT( )

Be aware of these items:
  • The SQLMAPPUTTO= system option must be set to SAS_PUT. This ensures that the SQL processor maps your PUT functions to the SAS_PUT( ) function and that the SAS_PUT( ) reference is passed through to Aster. SAS_PUT is the default value for the SQLMAPPUTTO= system option.
  • The SAS SQL processor translates the PUT function in the SQL SELECT statement into a reference to the SAS_PUT( ) function.
    select distinct cast(sas_put("sas"."mailorderdemo"."PRICE", 'DOLLAR8.2')
       as char(8)) as "PRICE_C" from "sas"."mailorderdemo"
    A large value, VARCHAR(n), is always returned because one function prototype accesses all formats. Use the CAST expression to reduce the width of the returned column to be a character width that is reasonable for the format that is being used.
    The return text cannot contain a binary zero value (hexadecimal 00) because the SAS_PUT( ) function always returns a VARCHAR(n) data type and an Aster VARCHAR(n) is defined to be a null-terminated string.

Explicit Use of the SAS_PUT( ) Function

Using the SAS_PUT( ) Function in an SQL Query

If you use explicit pass-through (direct connection to Aster), you can use the SAS_PUT( ) function call in your SQL program.
This example shows the same query from Implicit Use of the SAS_PUT( ) Function and explicitly uses the SAS_PUT( ) function call.
proc sql noerrorstop;
   title1 'Test SAS_PUT using Explicit Passthru;
   connect to aster(user=sas password=XXX database=sas server=sl96208);

   select * from connection to aster
      (select distinct cast(sas_put("PRICE",'DOLLAR8.2') as char(8)) as
         "PRICE_C" from mailorderdemo);

disconnect from aster;
quit;
The following lines are written to the SAS log.
 proc sql noerrorstop;
 title1 'Test SAS_PUT using Explicit Passthru ';
 connect to aster(user=sas password=XXX database=sas server=sl96208);

 select * from connection to aster
    (select distinct cast(sas_put("PRICE",'DOLLAR8.2') as char(8)) as
        "PRICE_C" from mailorderdemo);

            Test SAS_PUT using Explicit Passthru                        10
                                        13:42 Thursday, April 25, 2013

                          PRICE_C
                          _______
                            $8.00
                           $10.00
                           $12.00
                           $13.59
                           $13.99
                           $14.00
                           $27.98
                           $48.99
                           $54.00

disconnect from aster;
quit;

Considerations with Explicit Use of SAS_PUT( )

If you explicitly use the SAS_PUT( ) function in your code, it is recommended that you use double quotation marks around a column name to avoid any ambiguity with the keywords. For example, if you did not use double quotation marks around the column name, DATE, in this example, all date values would be returned as today's date.
select distinct
   cast(sas_put("price", 'dollar8.2') as char(8)) as "price_c",
   cast(sas_put("date", 'date9.1') as char(9)) as "date_d",
   cast(sas_put("inv", 'best8.') as char(8))  as "inv_n",
   cast(sas_put("name", '$32.') as char(32)) as "name_n"
from mailorderdemo;