2012 sql challenges between sas & oracle group presentations... · oracle examples all examples...

Post on 29-Aug-2019

232 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

SQL Challenges Between SAS & Oracle

Joel Choy

Nov 27, 2012

1

• Why SQL • Run Options • Problems • Oracle Examples • SAS Examples • Summary

2

Why SQL

Proc sort data=hr;

by empno;

Run;

Data temp (empno salary);

set HR

where salary > 10000;

Run;

Proc print data=temp;

Run;

Proc SQL;

select empno, salary from hr

where salary > 10000

order by empno;

Quit;

3

Why SQL

Proc sort data=hr; out=dep_salary;

by depno;

Run;

Proc summary data=dep_salary;

By depno ;

var salary;

output out=dep_sum_salary sum=;

Run;

Proc sql;

Create table dep_sum_salary as

select depno, sum( salary)

from hr

group by depno

order by 1;

Quit;

4

Why SQL

SAS SQL follows ANSI standards

Select column <, column>...

From table <, table>...

<where expression>

<group by column <, column>

<having expression>

<order by column <, column>

5

Run Options

6

Run Options

7

Run Options

8

Problems

ERROR: The SAS/ACCESS Interface to ORACLE cannot be loaded. ERROR: Image

SASORA found but not loadable.

ERROR: A Connection to the ORACLE DBMS is not currently supported, or is not installed at your site.

Solution: Install the correct Oracle client e.g. Oracle 10g client for PC sas 9.1.3

Or Make sure your PC path contains the Oracle 10g client bin directory ahead of other Oracle library bin.

9

Problems The following DOS prompt screen shows path has been fixed to search oracle_client_10

[C:\ORACLE\ORAHOME_10G\bin) ahead of other Oracle bin (e.g. Oracle 10gR2 data base bin (c:\oracle\product\10.2.0\db_1\bin;c:\ORA6I\bin]

Microsoft Windows [Version 6.0.6002] Copyright (c) 2006 Microsoft Corporation. All rights reserved. H:\>c: C:\>path PATH=C:\Program Files\Oracle\jre\1.1.7\bin;C:\ORACLE\ORAHOME_10G\bin;C:\oracle\p roduct\10.2.0\db_1\bin;C:\ORA6I\bin;C:\Program Files\CA\SharedComponents\PEC\bin ;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\Win dowsPowerShell\v1.0\;C:\Program Files\Common Files\Lenovo;C:\ORANT\dev21\bin;C:\ ORANT\DEV12\BIN;C:\Program Files\NetManage\Windows;C:\Program Files\QuickTime\QT System\;C:\Program Files\Windows Imaging\;C:\Program Files\Microsoft Application Virtualization Client;C:\Program Files\SAS\Shared Files\Formats;C:\des_817\bin; C:\Program Files\TortoiseSVN\bin C:\>

10

Problems

How to set path variable ?

If you have administrative rights to your work PC, then follow below step : ( otherwise ask IT staff to change the path for you)

In DOS prompt window, enter path to display the current path

Click the upper left small dos icon, select edit/select all/click left mouse button

Repeat step 2 select edit/Copy/click left mouse button

paste (CTL+V) to Notepad

Edit the path to put the path you want ahead of other path(s) and copy (CTL+C)

Go back to the DOS prompt window and enter set path= and paste (CTL+C) the entire path after =

OR

If you have Vista

Right click Computer / Properties / Advanced System Settings ; select Advanced tab then click Environment Variables

Under System Variables, locate and select Path and click edit

In the variable value you would copy and paste the new values

11

Oracle Examples Proc SQL <stimer noerrorstop>; connect to oracle <as alias> (user=oracle_schema,pw=oracle_schema_pw,path=

oracle_db_name<,buffsize=dbindex=,insertbuff=,readbuff=,updatebuff=>)

<create table sas_table_name as> select * from connection to oracle | alias ({oracle sql select statements here } ); <%put &sqlxmsg;> <Disconnect from oracle;> Quit;

12

Oracle Examples

Ex01 – simpliest code

proc sql ;

CONNECT TO ORACLE (USER=hr PW=orcl PATH='‘);

SELECT * FROM connection to oracle (

select * from hr.countries where rownum < 10

);

Quit;

13

Oracle Examples

All examples done on PC sas 9.1.3 sp4 with an old Oracle 10gR2

for Vista 32 bits Data Base installed on my work PC with default dbname=orcl, all demo schemas pw are the same = orcl

/* EX01 - simpliest oracle pass through syntax */

/* EX02 - what stimer, noerrorstop %put sqlxmsg do ? */

/* EX03 - would %put &sqlxmsg help us ? */

/*EX04 - &sqlxmsg seems redudant */

/* EX05 -can we simplify syntax with macros ? Yes */

/* EX06 - more examples with macros to pass through */

/* EX07 - multiple schema connections to pass through */

/* EX08 - execute examples for non-sql select stmts */

/* EX09 - oracle hints for the oracle optimizer */

14

Oracle Examples

19 /* EX01 - simpliest oracle pass through syntax 19 ! */ 20 /* with just 3 parms: user=, pw=, path='' 20 ! */ 21 /* path='' means use sample oracle 11gR2 data base installed on my 21 ! */ 22 /* pc. Actually you can even skip path= in this case but you will 22 ! */ 23 /* need to path= to specify connect entry for your oracle data base 23 ! */ 24 /* e.g. in Healthideas, path=dssp means connect to data base dssp 24 ! */ 25 proc sql ; 26 CONNECT TO ORACLE (USER=hr PW=XXXX path='' ); 27 SELECT * FROM connection to oracle ( 28 select * from hr.countries where rownum < 10 29 ); 30 Quit; NOTE: PROCEDURE SQL used (Total process time): real time 0.90 seconds cpu time 0.03 seconds

15

Oracle Examples

Ex01 output

16

Oracle Examples

/* EX02 - what does stimer, noerrorstop %put sqlxmsg disconnect buy us ? */

/* not very much except when we have problems */

proc sql stimer noerrorstop; CONNECT TO ORACLE (USER=hr PW=orcl PATH=''); SELECT * FROM connection to oracle ( select * from hr.countries where rownum < 10 ); %put &sqlxmsg; disconnect from oracle; Quit;

17

Oracle Examples

31 /* EX02 - what does stimer, noerrorstop %put sqlxmsg disconnect buy

31 ! us ? */

32 /* not very much except when we have problems

32 ! */

33 proc sql stimer noerrorstop;

NOTE: SQL Statement used (Total process time):

real time 0.00 seconds

cpu time 0.01 seconds

34 CONNECT TO ORACLE (USER=hr PW=XXXX PATH='');

NOTE: SQL Statement used (Total process time):

real time 0.90 seconds

cpu time 0.06 seconds

35 SELECT * FROM connection to oracle (

36 select * from hr.countries where rownum < 10

37 );

NOTE: SQL Statement used (Total process time):

real time 0.00 seconds

cpu time 0.00 seconds

38 %put &sqlxmsg;

39 disconnect from oracle;

NOTE: SQL Statement used (Total process time):

real time 0.00 seconds

cpu time 0.00 seconds

40 Quit;

NOTE: PROCEDURE SQL used (Total process time):

real time 0.00 seconds

cpu time 0.00 seconds

18

Oracle Examples

• /* EX03 - would %put &sqlxmsg help us ? */ • /* try to force an oracle sql syntax error */ • /* by selecting a non-existant table country instead of countries

*/ • proc sql stimer noerrorstop; • CONNECT TO ORACLE (USER=hr PW=orcl PATH=''); • SELECT * FROM connection to oracle ( • select * from hr.country where rownum < 10 • ); • %put &sqlxmsg; • disconnect from oracle; • Quit;

19

Oracle Examples • 41 /* EX03 - would %put &sqlxmsg help us ? • 41 ! */ • 42 /* try to force an oracle sql syntax error • 42 ! */ • 43 /* by selecting a non-existant table country instead of countries • 43 ! */ • 44 proc sql stimer noerrorstop; • NOTE: SQL Statement used (Total process time): • real time 0.00 seconds • cpu time 0.00 seconds

• 45 CONNECT TO ORACLE (USER=hr PW=XXXX PATH=''); • NOTE: SQL Statement used (Total process time): • real time 1.02 seconds • cpu time 0.01 seconds

• 46 SELECT * FROM connection to oracle ( • 47 select * from hr.country where rownum < 10 • 48 ); • ERROR: ORACLE prepare error: ORA-00942: table or view does not exist. • SQL statement: select * from hr.country where rownum < 10. • NOTE: SQL Statement used (Total process time): • real time 0.05 seconds • cpu time 0.00 seconds

• 49 %put &sqlxmsg; • ORA-00942: table or view does not exist • 50 disconnect from oracle; • NOTE: SQL Statement used (Total process time): • real time 0.00 seconds • cpu time 0.00 seconds

• 51 Quit; • NOTE: PROCEDURE SQL used (Total process time): • real time 0.00 seconds • cpu time 0.00 seconds

20

Oracle Examples

• /* EX04 - would %put &sqlxmsg help us ? */

• /* try to force an oracle sql syntax error */ • /* not really, can do without it */ • proc sql; • CONNECT TO ORACLE (USER=hr PW=orcl PATH=''); • SELECT * FROM connection to oracle ( • select * from hr.country where rownum < 10 • ); • * %put &sqlxmsg; • disconnect from oracle; • Quit;

21

Oracle Examples

52 /* EX04 - would %put &sqlxmsg help us ? 52 ! */ 53 /* try to force an oracle sql syntax error 53 ! */ 54 /* not really, can do without it 54 ! */ 55 proc sql; 56 CONNECT TO ORACLE (USER=hr PW=XXXX PATH=''); 57 SELECT * FROM connection to oracle ( 58 select * from hr.country where rownum < 10 59 ); ERROR: ORACLE prepare error: ORA-00942: table or view does not exist. SQL statement: select * from hr.country where rownum < 10. 60 * %put &sqlxmsg; 61 disconnect from oracle; 62 Quit; NOTE: The SAS System stopped processing this step because of errors. NOTE: PROCEDURE SQL used (Total process time): real time 0.91 seconds cpu time 0.03 seconds

22

Oracle Examples

/* EX05 - can we simplify the pass through syntax with macros ? */ /* Yes ! */ %macro oracle_select(stmt); proc sql ; CONNECT TO ORACLE (USER=hr PW=orcl PATH=''); SELECT * FROM connection to oracle ( &stmt ); disconnect from oracle; quit; %mend; %oracle_select(select * from hr.countries where rownum < 10);

23

Oracle Examples

63 /* EX05 - can we simplify the pass through syntax with macros ? */ 64 /* Yes ! */ 65 66 %macro oracle_select(stmt); 67 proc sql ; 68 CONNECT TO ORACLE (USER=hr PW=orcl PATH=''); 69 70 71 SELECT * FROM connection to oracle ( 72 &stmt 73 ); 74 75 disconnect from oracle; 76 quit; 77 %mend; 78 79 %oracle_select(select * from hr.countries where rownum < 10); NOTE: PROCEDURE SQL used (Total process time): real time 0.89 seconds cpu time 0.01 seconds

24

Oracle Examples

• /* EX06 macro oracle_connect to connect to a schema@orcl only */ • /* macro oracle_select to execute oracle sql stmt only */ • /* macro oracle_disconnect to disconnect from orcl +quit */ • /* note the importance of quit stmt and ability to invoke macros */ • /* between 1 proc sql and 1 quit only */ • /* dealing with 1 schema only */

• %macro oracle_connect(schema); • proc sql ; • CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000); • %mend;

• %macro oracle_select(stmt);

• SELECT * FROM connection to oracle ( • &stmt • );

• %mend;

• %macro oracle_disconnect; • disconnect from oracle; • quit; • %mend; • • %oracle_connect(hr); • %oracle_select(select * from hr.countries); • %oracle_select(select * from hr.jobs); • %oracle_disconnect;

25

Oracle Examples 80 /* EX06 macro oracle_connect to connect to a schema@orcl only 80 ! */ 81 /* macro oracle_select to execute oracle sql stmt only 81 ! */ 82 /* macro oracle_disconnect to disconnect from orcl +quit 82 ! */ 83 /* note the importance of quit stmt and ability to invoke 83 ! macros */ 84 /* between 1 proc sql and 1 quit only 84 ! */ 85 /* dealing with 1 schema only 85 ! */ 86 87 %macro oracle_connect(schema); 88 proc sql ; 89 CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000); 90 %mend; 91 92 %macro oracle_select(stmt); 93 94 SELECT * FROM connection to oracle ( 95 &stmt 96 ); 97 98 %mend; 99 100 %macro oracle_disconnect; 101 disconnect from oracle; 102 quit; 103 %mend; 104 105 %oracle_connect(hr); 106 %oracle_select(select * from hr.countries); 107 %oracle_select(select * from hr.jobs); 108 %oracle_disconnect; NOTE: PROCEDURE SQL used (Total process time): real time 0.93 seconds cpu time 0.06 seconds

26

Oracle Examples

EX06 output

27

Oracle Examples

EX06 Output

28

Oracle Examples

/* EX07 same as example 06 except separate oracle connection and oracle select */ /* note multiple oracle connections to different schemas: hr@orcl sh@orcl */ /* note also mulitple proc sql, quit with no disconnect from oracle connection */ %macro oracle_connect(schema); proc sql ; CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000); %mend; %macro oracle_select(stmt); SELECT * FROM connection to oracle ( &stmt ); quit; %mend; %oracle_connect(hr); %oracle_select(select * from hr.countries where rownum < 5); %oracle_connect(sh); %oracle_select(select * from sh.channels);

29

Oracle Examples 109 /* EX07 same as example 06 except separate oracle connection and 109! oracle select */ 110 /* note multiple oracle connections to different schemas: 110! hr@orcl sh@orcl */ 111 /* note also mulitple proc sql, quit with no disconnect from 111! oracle connection */ 112 113 %macro oracle_connect(schema); 114 proc sql ; 115 CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000); 116 %mend; 117 118 %macro oracle_select(stmt); 119 120 SELECT * FROM connection to oracle ( 121 &stmt 122 ); 123 quit; 124 125 %mend; 126 127 %oracle_connect(hr); 128 %oracle_select(select * from hr.countries where rownum < 5); NOTE: PROCEDURE SQL used (Total process time): real time 0.91 seconds cpu time 0.06 seconds 129 130 %oracle_connect(sh); 131 %oracle_select(select * from sh.channels); NOTE: PROCEDURE SQL used (Total process time): real time 0.96 seconds cpu time 0.03 seconds

30

Oracle Examples

EX07 output

31

Oracle Examples

EX07 output

32

Oracle Examples

• /* EX08 oracle connection to hr@orcl with oracle_connect */ • /* use execute stmt of proc sql to execute oracle non-select stmts */ • /* e.g. drop and create an oracle table jobs2 in hr@orcl */ • %macro oracle_connect(schema); • proc sql ; • CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000); • %mend;

• %macro oracle_select(stmt);

• SELECT * FROM connection to oracle ( • &stmt • );

• %mend;

• %macro oracle_execute(stmt); • execute (&stmt) by oracle; • %mend; • • %oracle_connect(hr); • • %oracle_execute(drop table jobs2); • %oracle_select(select count(*) from jobs); • %oracle_execute(create table jobs2 as select * from jobs);

• quit;

33

Oracles Examples • 132 /* EX08 oracle connection to hr@orcl with oracle_connect • 132! */ • 133 /* use execute stmt of proc sql to execute oracle non-select • 133! stmts */ • 134 /* e.g. drop and create an oracle table jobs2 in hr@orcl • 134! */ • 135 %macro oracle_connect(schema); • 136 proc sql ; • 137 CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000); • 138 %mend; • 139 • 140 %macro oracle_select(stmt); • 141 • 142 SELECT * FROM connection to oracle ( • 143 &stmt • 144 ); • 145 • 146 %mend; • 147 • 148 %macro oracle_execute(stmt); • 149 execute (&stmt) by oracle; • 150 %mend; • 151 • 152 %oracle_connect(hr); • 153 • 154 %oracle_execute(drop table jobs2); • 155 %oracle_select(select count(*) from jobs); • 156 %oracle_execute(create table jobs2 as select * from jobs); • 157 • 158 quit; • NOTE: PROCEDURE SQL used (Total process time): • real time 1.26 seconds • cpu time 0.01 seconds

34

Oracle Examples

35

EX08 output

Oracle Examples

• /* EX09 oracle connection to hr@orcl with oracle_connect */ • /* preserve_comments=yes to pass oracle hints to oracle optimizer */ • /* + first_rows enclosed in slash asterik means use the plan with the lowest cost */ • /* e.g. good for select from tables with billions of rows */ • %macro oracle_connect(schema); • proc sql ; • CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000 PRESERVE_COMMENTS=yes); • %mend;

• %macro oracle_select(stmt);

• SELECT * FROM connection to oracle ( • &stmt • );

• %mend;

• %oracle_connect(hr);

• %oracle_select(select /*+ FIRST_ROWS */ * from employees where rownum < 10);

• quit;

36

Oracle Examples 181 /* EX09 oracle connection to hr@orcl with oracle_connect 181! */ 182 /* preserve_comments=yes to pass oracle hints to oracle 182! optimizer */ 183 /* + first_rows enclosed in slash asterik means use the plan 183! with the lowest cost */ 184 /* e.g. good for select from tables with billions of rows 184! */ 185 %macro oracle_connect(schema); 186 proc sql ; 187 CONNECT TO ORACLE (USER=&schema PW=orcl PATH='' BUFFSIZE=20000 187! PRESERVE_COMMENTS=yes); 188 %mend; 189 190 %macro oracle_select(stmt); 191 192 SELECT * FROM connection to oracle ( 193 &stmt 194 ); 195 196 %mend; 197 198 %oracle_connect(hr); 199 200 %oracle_select(select /*+ FIRST_ROWS */ * from employees where 200! rownum < 10); 201 202 quit; NOTE: PROCEDURE SQL used (Total process time): real time 1.03 seconds cpu time 0.04 seconds

37

Oracle Examples

EX09 output

38

SAS Examples

Libname oracle_library_name oracle user=oracle_schema pw=oracle_schema_pw path=oracle database name

<buffsize= dbindex= insertbuff=.....> <schema=> <dbconinit=>;

Data sas_oracle_table;

set oracle_library_name.oracle_schema_table

Run;

Proc sql <outobs=n>;

any sas sql stmts syntax referencing oracle_library_name.oracle_schema_table

Quit;

39

SAS examples

/*EX10 create an oracle table 1 libname stmt 1 schema */

/*EX11 create oracle table 2 libname stmts 2 schemas */

40

SAS Examples

• /* EX10 oracle connection to hr@orcl via a libname stmt */ • /* libname oralib oracle user= pw= */ • /* proc sql without connect to oracle stmt */ • /* but select from oralib.oracle_table_name */ • /* even create a oracle table */

• %macro oracle_sas_select(oracle_table); • proc sql; • SELECT * FROM oralib.&oracle_table; • quit; • %mend;

• %macro oracle_sas_create_table(new_oracle_table,oracle_table); • proc sql; • drop table oralib.&new_oracle_table; • create table oralib.&new_oracle_table as select * from oralib.&oracle_table; • quit; • %mend;

• * libname oralib clear;

• libname oralib oracle user=hr pw=orcl path='';

• %oracle_sas_select(regions); • %oracle_sas_create_table(regions2,regions); •

41

SAS Examples 203 /* EX10 oracle connection to hr@orcl via a libname stmt 203! */ 204 /* libname oralib oracle user= pw= 204! */ 205 /* proc sql without connect to oracle stmt 205! */ 206 /* but select from oralib.oracle_table_name 206! */ 207 /* even create a oracle table 207! */ 208 209 210 %macro oracle_sas_select(oracle_table); 211 proc sql; 212 SELECT * FROM oralib.&oracle_table; 213 quit; 214 %mend; 215 216 217 %macro oracle_sas_create_table(new_oracle_table,oracle_table); 218 proc sql; 219 drop table oralib.&new_oracle_table; 220 create table oralib.&new_oracle_table as select * from 220! oralib.&oracle_table; 221 quit; 222 %mend; 223 224 * libname oralib clear; 225 226 libname oralib oracle user=hr pw=XXXX path=''; NOTE: Libref ORALIB was successfully assigned as follows: Engine: ORACLE Physical Name: 227 228 %oracle_sas_select(regions); NOTE: PROCEDURE SQL used (Total process time): real time 0.04 seconds cpu time 0.00 seconds 229 %oracle_sas_create_table(regions2,regions); NOTE: Table ORALIB.REGIONS2 has been dropped. NOTE: SAS variable labels, formats, and lengths are not written to DBMS tables. NOTE: Table ORALIB.REGIONS2 created, with 4 rows and 2 columns. NOTE: PROCEDURE SQL used (Total process time): real time 1.88 seconds cpu time 0.06 seconds

42

SAS Examples

EX10 output

43

SAS Examples

EX10 output

44

SAS Examples

/* EX11 oracle connection to hr@orcl & sh@orcl via 2 libname stmts */ /* libname oralib oracle user=sh pw= schema=hr (set current session to hr) */ /* libname oralib2 oracle user=sh pw= */ /* sh must be granted select on hr.regions first by sys */ /* select from oralib.regions (from hr schema) */ /* create a oracle table regions3 in sh only 3 obs */ * options mprint; %macro oracle_sas_select(oracle_table); proc sql; SELECT * FROM oralib.&oracle_table; quit; %mend; %macro oracle_sas_create_table(new_oracle_table,oracle_table); proc sql outobs=3; drop table oralib2.&new_oracle_table; create table oralib2.&new_oracle_table as select * from oralib.&oracle_table; quit; %mend; libname oralib clear; libname oralib oracle user=sh pw=orcl path='' schema=hr ; /* dbconinit="BEGIN execute immediate 'alter session set current_schema=hr'; END;" ; */ libname oralib2 oracle user=sh pw=orcl path=''; %oracle_sas_select(regions); %oracle_sas_create_table(regions3,regions);

45

SAS Examples 230 /* EX11 oracle connection to hr@orcl & sh@orcl via 2 libname stmts 230! */ 231 /* libname oralib oracle user=sh pw= schema=hr (set current 231! session to hr) */ 232 /* libname oralib2 oracle user=sh pw= 232! */ 233 /* sh must be granted select on hr.regions first by sys 233! */ 234 /* select from oralib.regions (from hr schema) 234! */ 235 /* create a oracle table regions3 in sh only 3 obs 235! */ 236 237 * options mprint; 238 %macro oracle_sas_select(oracle_table); 239 proc sql; 240 SELECT * FROM oralib.&oracle_table; 241 quit; 242 %mend; 243 244 245 %macro oracle_sas_create_table(new_oracle_table,oracle_table); 246 proc sql outobs=3; 247 drop table oralib2.&new_oracle_table; 248 create table oralib2.&new_oracle_table as select * from 248! oralib.&oracle_table; 249 quit; 250 %mend; 251 252 libname oralib clear; NOTE: Libref ORALIB has been deassigned. 253 254 libname oralib oracle user=sh pw=XXXX path='' schema=hr ; NOTE: Libref ORALIB was successfully assigned as follows: Engine: ORACLE Physical Name: 255 /* dbconinit="BEGIN execute immediate 'alter session set 255! current_schema=hr'; END;" ; */ 256 257 libname oralib2 oracle user=sh pw=XXXX path=''; NOTE: Libref ORALIB2 was successfully assigned as follows: Engine: ORACLE Physical Name: 258 259 %oracle_sas_select(regions); NOTE: PROCEDURE SQL used (Total process time): real time 0.00 seconds cpu time 0.00 seconds 46

SAS Examples

260 %oracle_sas_create_table(regions3,regions); NOTE: Table ORALIB2.REGIONS3 has been dropped. NOTE: SAS variable labels, formats, and lengths are not written to

DBMS tables. WARNING: Statement terminated early due to OUTOBS=3 option. NOTE: Table ORALIB2.REGIONS3 created, with 3 rows and 2 columns. NOTE: PROCEDURE SQL used (Total process time): real time 1.79 seconds cpu time 0.03 seconds

47

SAS Examples

EX11 output

48

SAS Examples

EX11 output

49

Summary

• Proc SQL very useful procedure in SAS

• Choose between sas syntax or pass through to Oracle syntax

• Use pass through to Oracle syntax when Oracle hints required or if you have code in Oracle syntax

50

top related