|
| 1 | +USE sales |
| 2 | +GO |
| 3 | + |
| 4 | +-- Create database scoped credential to connect to Oracle server |
| 5 | +-- Provide appropriate credentials to Oracle server in below statement. |
| 6 | +-- If you are using SQL Server Management Studio then you can replace the parameters using |
| 7 | +-- the Query menu, and "Specify Values for Template Parameters" option. |
| 8 | +IF NOT EXISTS(SELECT * FROM sys.database_scoped_credentials WHERE name = 'OracleCredential') |
| 9 | + CREATE DATABASE SCOPED CREDENTIAL [OracleCredential] |
| 10 | + WITH IDENTITY = '<oracle_user,nvarchar(100),sales>', SECRET = '<oracle_user_password,nvarchar(100),sql19tw0oracle>'; |
| 11 | + |
| 12 | +-- Create external data source that points to Oracle server |
| 13 | +-- |
| 14 | +IF NOT EXISTS(SELECT * FROM sys.external_data_sources WHERE name = 'OracleSalesSrvr') |
| 15 | + CREATE EXTERNAL DATA SOURCE [OracleSalesSrvr] |
| 16 | + WITH (LOCATION = 'oracle://<oracle_server,nvarchar(100),oracle-server-name>',CREDENTIAL = [OracleCredential]); |
| 17 | + |
| 18 | +-- Create external table over inventory table on Oracle server |
| 19 | +-- NOTE: Table names and column names will use ANSI SQL quoted identifier while querying against Oracle. |
| 20 | +-- As a result, the names are case-sensitive so specify the name in the external table definition |
| 21 | +-- that matches the exact case of the table and column names in the Oracle metadata. |
| 22 | +CREATE EXTERNAL TABLE [dbo].[customer_ora] |
| 23 | +( |
| 24 | + [C_CUSTOMER_SK] DECIMAL(10,0), |
| 25 | + [C_CUSTOMER_ID] VARCHAR(16) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 26 | + [C_CURRENT_CDEMO_SK] DECIMAL(10,0), |
| 27 | + [C_CURRENT_HDEMO_SK] DECIMAL(10,0), |
| 28 | + [C_CURRENT_ADDR_SK] DECIMAL(10,0), |
| 29 | + [C_FIRST_SHIPTO_DATE_SK] DECIMAL(10,0), |
| 30 | + [C_FIRST_SALES_DATE_SK] DECIMAL(8,0), |
| 31 | + [C_SALUTATION] VARCHAR(10) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 32 | + [C_FIRST_NAME] VARCHAR(20) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 33 | + [C_LAST_NAME] VARCHAR(30) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 34 | + [C_PREFERRED_CUST_FLAG] VARCHAR COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 35 | + [C_BIRTH_DAY] DECIMAL(8,0), |
| 36 | + [C_BIRTH_MONTH] DECIMAL(8,0), |
| 37 | + [C_BIRTH_YEAR] DECIMAL(8,0), |
| 38 | + [C_BIRTH_COUNTRY] VARCHAR(20) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 39 | + [C_LOGIN] VARCHAR(13) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 40 | + [C_EMAIL_ADDRESS] VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS, |
| 41 | + [C_LAST_REVIEW_DATE] VARCHAR(20) COLLATE SQL_Latin1_General_CP1_CI_AS |
| 42 | +) |
| 43 | +WITH (DATA_SOURCE=[OracleSalesSrvr], |
| 44 | + LOCATION='<oracle_service_name,nvarchar(30),xe>.SALES.CUSTOMER'); |
| 45 | +GO |
| 46 | + |
| 47 | +-- Find product reviews of customers who made purchases of items in a specific time window: |
| 48 | +-- |
| 49 | +SELECT pr.pr_item_sk, pc.pr_review_content, pr.pr_user_sk AS customerid |
| 50 | +FROM dbo.product_reviews as pr |
| 51 | +JOIN (SELECT TOP(100) * FROM dbo.product_reviews_hdfs_csv) AS pc ON pc.pr_review_sk = pr.pr_review_sk |
| 52 | +JOIN dbo.customer_ora AS c ON c.c_customer_sk = pr.pr_user_sk |
| 53 | +JOIN dbo.item AS i ON i.i_item_sk = pr.pr_item_sk |
| 54 | +INNER JOIN ( |
| 55 | + SELECT |
| 56 | + ws_item_sk |
| 57 | + FROM web_sales ws |
| 58 | + WHERE |
| 59 | + ws.ws_item_sk IS NOT null |
| 60 | + AND ws_sold_date_sk IN |
| 61 | + ( |
| 62 | + SELECT d_date_sk |
| 63 | + FROM date_dim d |
| 64 | + WHERE d.d_date >= '2003-01-02' |
| 65 | + AND d.d_date <= '2004-01-02' |
| 66 | + ) |
| 67 | + GROUP BY ws_item_sk ) s |
| 68 | + ON pr.pr_item_sk = s.ws_item_sk; |
| 69 | + |
| 70 | +-- Cleanup |
| 71 | +-- |
| 72 | +/* |
| 73 | +DROP EXTERNAL TABLE [customer_ora]; |
| 74 | +DROP EXTERNAL DATA SOURCE [OracleSalesSrvr] ; |
| 75 | +DROP DATABASE SCOPED CREDENTIAL [OracleCredential]; |
| 76 | +*/ |
0 commit comments