Chapter 7 Converting Queries to Teradata SQL. Teradata 2800
विज्ञापन
विज्ञापन
CHAPTER 7
Converting Queries to Teradata SQL
When converting existing SQL queries to Teradata SQL, you must to address the differences between your existing database and Teradata Database. The topics in this chapter show some of the main differences, using conversion from Oracle as an example. Conversions from other databases involve similar considerations.
Always test converted queries thoroughly before moving them to a production environment.
Compare the query results in your current system to the query results in Teradata Database to verify that the converted queries run as expected.
Recommendation: You can convert existing SQL as written and translate it directly to
Teradata SQL. However, this approach may not fully use the benefits that Teradata provides.
The best approach for some query types may be to migrate your business rules and logical framework into Teradata and then create new queries that are optimized for the Teradata
Database environment.
Query Conversion Overview
When converting existing queries to Teradata SQL, make sure to consider the requirements in each of the following topics:
•
“Converting Data Types to Teradata Data Types” on page 200
•
“Converting Built-in SQL Functions” on page 200
•
“Converting Hierarchical Joins” on page 203
•
“Converting Outer Joins” on page 204
•
“Checking the Use of NULLs in Queries” on page 205
•
“Converting Nested Aggregate Operations” on page 205
•
“Converting External Tables to Table Functions” on page 206
•
“Converting Queue Tables” on page 206
•
“Converting Queries to Set Processing” on page 207
•
“Converting PL/SQL Functions” on page 209
•
“General Considerations for Using Teradata SQL” on page 210
Teradata Data Warehouse Appliance 2800 Implementation Guide 199
Chapter 7: Converting Queries to Teradata SQL
Converting Data Types to Teradata Data Types
Converting Data Types to Teradata Data Types
Some data types supported in your current database may function the same in Teradata
Database, while other data types must be converted to Teradata data types. For details, see
“About Teradata Data Types” on page 393 .
Also, be aware of possible differences in the rules for converting data from one type to another, especially in the case of implicit data type conversions.
Teradata Database permits the assignment and comparison of some types without requiring the types to be explicitly converted. Teradata also performs implicit type conversions on some argument types (for example, SQRT) passed to macros, procedures, and SQL functions.
You can explicitly convert one data type to another using the CAST function. For example:
CAST (expression AS ansi_sql_data_type|data_definition_list) where:
Syntax Element
expression
Explanation
An expression with known data type to be converted to a different data type.
ansi_sql_data_type
The new data type for expression.
data_definition_list
The new data type or data attributes or both for expression.
Reference Information
Information on...
Teradata data types data type conversions
Is available in...
•
“About Teradata Data Types” on page 393
•
SQL Data Types and Literals, B035-1141
Chapter 17: “Data Type Conversions” in SQL
Functions, Operators, Expressions, and Predicates
Converting Built-in SQL Functions
Oracle SQL includes a collection of data manipulation functions, some of which are uniquely required by Oracle to support its ability to compare stored data to literal values, or to convert external data values to a data type that Oracle may store. Some Oracle SQL functions may be directly translated to the equivalent Teradata SQL function, but others may not.
If you use built-in SQL functions that are specific for your database, you must convert those functions so that they can be used in Teradata. You have the following options:
•
Replace the built-in function with an equivalent Teradata SQL function. See “About
Oracle-Equivalent Teradata UDFs” on page 201
.
200 Teradata Data Warehouse Appliance 2800 Implementation Guide
Chapter 7: Converting Queries to Teradata SQL
Converting Built-in SQL Functions
•
Translate the function into Teradata SQL and incorporate it into a converted SQL query or
save it as a procedure (in Teradata, referred to as a stored procedure). See “Translating
Built-in SQL Functions to Teradata SQL” on page 202 .
•
Create a new Teradata user-defined function (UDF) that provides the same functionality
as the existing built-in function. See “Reference Information” on page 204 for a list of
documents with information about UDF creation and use.
About Oracle-Equivalent Teradata UDFs
The Teradata Developer Exchange provides user-defined functions (UDFs) that emulate the most commonly used Oracle built-in SQL functions, including:
•
ADD_MONTHS
•
ASCII
•
BITAND
•
CEIL
•
CHR
•
DECODE
•
FLOOR
•
GREATEST
•
GREPC
•
INITCAP
•
INSTR
•
LAST_DAY
•
LEAST
•
LENGTH
•
LPAD
•
LTRIM
•
MONTHS_BETWEEN
•
NVL
•
REPLACE
•
ROUND
•
ROUND_TEST
•
RPAD
•
RTRIM
•
SIGN
•
TO_CHAR
•
TO_DATE
•
TO_NUMBER
•
TRANSLATE
•
TRUNC
•
UNICODE
After you install these UDFs, when Teradata Database encounters a call to an Oracle built-in
SQL function, it invokes the corresponding UDF to process the function call.
For additional information on Teradata UDFs, see
“About User-Defined Functions” on page 406
.
Installing Oracle-Equivalent Teradata UDFs
1
2
3
4
5
Verify that your Teradata system has a C or C++ compiler on the node used to compile the
UDFs.
Go to the Teradata Developer Exchange at: http://developer.teradata.com and use the search function to find “Teradata UDFs for Popular Oracle Functions.”
Download the UDFs (oraudfs_v_4.zip).
Open oraudfs_v_4.zip and extract the files, specifying the folder where you want the files extracted and selecting the option to extract the files using folder names.
Open the extracted ReadMe.txt file and follow the instructions to install the UDFs.
Make sure the default database for the session is the database in which you want the UDFs installed. Teradata Database provides a public database called SYSLIB for installing global functions.
IMPORTANT: Teradata provides these UDFs only for customer convenience. Although the UDFs are proven to work in many situations, Teradata does not support the UDFs, does not guarantee that the UDFs will work in all environments, and assumes no responsibility if the UDFs do not produce the expected results. Customers who implement
Teradata Data Warehouse Appliance 2800 Implementation Guide 201
Chapter 7: Converting Queries to Teradata SQL
Converting Built-in SQL Functions the UDFs are responsible for testing UDF results against the corresponding Oracle function results to ensure that the UDFs work as expected.
Using Oracle-Equivalent Teradata UDFs
1
Grant users who invoke the UDFs the EXECUTE FUNCTION privilege on the functions or on the database containing the functions. For example, if you installed the UDFs in the
SYSLIB database, the following SQL statement provides user blink with privileges to invoke the UDFs:
2
GRANT EXECUTE FUNCTION ON SYSLIB TO blink;
Use the UDFs anywhere you would use the corresponding Oracle built-in SQL functions.
Each subfolder that was created when you extracted the ZIP file contains a .btq file that provides an example of how to use a particular UDF.
Translating Built-in SQL Functions to Teradata SQL
If you do not want to use the Teradata UDFs for Oracle, you can rewrite the Oracle built-in functions using Teradata SQL and Teradata built-in functions. The following table shows how some of the Oracle functions can be translated to Teradata SQL.
Oracle
DECODE(a,b,c,d)
GREATEST(a,b)
LEAST(a,b)
SIGN(a)
NVL(a,b)
INSTR(s,c)
LENGTH(s)
LPAD(a,n)
LTRIM(a,c)
LTRIM(RTRIM(a,c))
RTRIM(a,c)
TO_CHAR(x[, f])
TO_DATE(x[, f])
TO_NUM(BER)(x[, f])
Teradata
CASE a WHEN b THEN c ELSE d END
CASE WHEN a >= b THEN a ELSE b END
CASE WHEN a <= b THEN a ELSE b END
CASE a WHEN > 0 THEN 1
WHEN < 0 THEN -1
ELSE 0 END
COALESCE(a, b) or
ZEROIFNULL(n)
INDEX(s,c)
CHAR_LENGTH(s)
CAST (a AS CHAR(n) )
TRIM (LEADING c FROM a)
TRIM (BOTH c FROM a)
TRIM (TRAILING c FROM a)
CAST (x AS CHAR(n) [FORMAT 'f'] )
CAST (x AS DATE|TIMESTAMP [FORMAT 'f'] )
CAST (x AS NUMERIC(n,m) [FORMAT 'f'] )
202 Teradata Data Warehouse Appliance 2800 Implementation Guide
Chapter 7: Converting Queries to Teradata SQL
Converting Hierarchical Joins
Oracle
TRUNC
MONTHS_BETWEEN(d,e)
Reference Information
Teradata
CAST (x AS DATE FORMAT 'f')
ABS (CAST ((d - e) MONTH(4) AS INTEGER))
Information on...
UDFs
Procedures and external procedures
Supported functions in Teradata Database
Teradata built-in functions
CASE and COALESCE expressions
•
using ZEROIFNULL to convert data from null to 0
•
using ABS to compute the absolute value of an argument
TRIM and INDEX string functions using CHAR_LENGTH to get the length of a string either in logical characters or in bytes explicit data type conversions using CAST using the FORMAT phrase to control the display of expressions, column data, and conversions between data types
Is available in...
“About User-Defined Functions” on page 406
“About Procedures and External Procedures” on page 404
SQL Functions, Operators, Expressions, and Predicates,
B035-1145
Converting Hierarchical Joins
Teradata supports hierarchical queries, but the syntax for coding hierarchical queries in
Teradata may differ from the syntax used in your current database. Therefore, you may need to rewrite existing hierarchical queries using Teradata syntax.
The following example shows an Oracle hierarchical query. This query returns the employee
IDs of the people who work for the manager whose employee ID is 801. The results returned include all the employees that work directly for employee 801, as well as all the people that work within the management hierarchy of the organization that employee 801 belongs to.
SELECT Employee_Id FROM
( SELECT Employee_Id FROM Employee start with Employee_id = 801 connect by prior Employee_Id = Manager_Id
Teradata Data Warehouse Appliance 2800 Implementation Guide 203
Chapter 7: Converting Queries to Teradata SQL
Converting Outer Joins
)
WHERE Employee_Id ^= 801
ORDER BY Employee_Id;
You can create the same query in Teradata as follows:
WITH RECURSIVE Temp_Table (Employee_Number) AS
( SELECT Root.Employee_Number
FROM Employee Root
WHERE Root.Manager_Employee_Number = 801
UNION ALL
SELECT Indirect.Employee_Number
FROM Temp_Table Direct, Employee Indirect
WHERE Direct.Employee_Number = Indirect.Manager_Employee_Number
)
SELECT * FROM Temp_Table ORDER BY Employee_Number;
Reference Information
Information on...
the concept of recursive queries use of the WITH [RECURSIVE] Request
Modifier in a query
Is available in...
SQL Fundamentals, B035-1141
SQL Data Manipulation Language, B035-1146
Converting Outer Joins
Teradata supports Left, Right, and Full outer joins, but the syntax for coding outer joins in
Teradata SQL may differ from the syntax used in querying your current database. Therefore, you may have to rewrite your outer joins using the Teradata SQL syntax.
The following example shows the outer join syntax for Teradata. This is also the standard, suggested outer join syntax for Oracle.
The query returns a sorted report of department IDs and names of employees that work in those departments. All employees appear in the returned list. If the Dept_ID of an employee is not present in the Department table, then the Dept_ID shown for that employee is null.
SELECT A.Dept_ID, B.Name
FROM Department A LEFT OUTER JOIN Employee B
ON A.Dept_ID = B.Dept_ID
ORDER BY A.Dept_ID, B.Name;
Oracle also supports this older outer join syntax, which is not supported in Teradata:
SELECT A.Dept_ID, B.Name
FROM Department A, Employee B
WHERE A.Dept_ID = B.Dept_ID(+)
ORDER BY A.Dept_ID, B.Name;
Queries written using this old outer join syntax must be rewritten to use the Teradata syntax.
204 Teradata Data Warehouse Appliance 2800 Implementation Guide
Chapter 7: Converting Queries to Teradata SQL
Checking the Use of NULLs in Queries
Reference Information
Information on...
outer joins
Is available in...
SQL Data Manipulation Language, B035-1146
Checking the Use of NULLs in Queries
In Teradata Database, the keyword NULL is not the same as an empty string. A null is a place holder indicating that no value is present. An empty string (' ') is a real value.
For example, given the following statements:
INSERT INTO String_Table VALUES ('', 'TestString');
INSERT INTO String_Table VALUES (NULL, 'TestString');
SELECT Column1, Column2 FROM String_Table;
In Oracle, the output from the SELECT statement is:
Column1 Column2
-------------
?
?
TestString
TestString where '?' is the default value displayed for a null by the application that executed the query.
Note that the empty string is interpreted as a null in Oracle.
In Teradata Database, the output from the SELECT statement (using SQL Assistant) displays an empty string corresponding to the first INSERT statement, and a null for the second
INSERT statement.
Column1 Column2
-------------
?
TestString
TestString
Reference Information
Information on...
nulls character string literals
Is available in...
SQL Fundamentals, B035-1141
SQL Data Types and Literals, B035-1143
Converting Nested Aggregate Operations
Aggregate operations cannot be nested in Teradata Database.
Teradata Data Warehouse Appliance 2800 Implementation Guide 205
Chapter 7: Converting Queries to Teradata SQL
Converting External Tables to Table Functions
For example, in Oracle, the following is valid:
SELECT MIN(SUM(…))
In Teradata, you must use syntax such as:
SELECT MIN(T.C) FROM (SELECT SUM(…)) as T(C);
Aggregates can be nested in aggregate window functions. The following statement is valid in
Teradata Database and includes an aggregate SUM function nested in a RANK window function:
SELECT region
,product
,SUM(amount)
,RANK() OVER (PARTITION BY region ORDER by SUM (amount))
FROM table;
Reference Information
Information on...
aggregates aggregate window functions
Is available in...
SQL Functions, Operators, Expressions, and Predicates, B035-1145
SQL Functions, Operators, Expressions, and Predicates, B035-1145
Converting External Tables to Table Functions
Oracle External Tables must be converted to Table Functions in Teradata Database. A table function is a type of UDF, which is invoked in the FROM clause of an SQL SELECT statement and which returns a table a row at a time in a loop to the SELECT statement. The function can produce the rows of a table from the input arguments passed to it or by reading an external file or message queue.
The number of columns in the rows that a table function returns can be specified dynamically at runtime in the SELECT statement that invokes the table function.
Reference Information
Information on...
UDFs
Is available in...
“About User-Defined Functions” on page 406
Converting Queue Tables
The queue tables supported in non-Teradata databases often have similar functionality to
Teradata queue tables, but there may be differences in the way the tables are created and
206 Teradata Data Warehouse Appliance 2800 Implementation Guide
Chapter 7: Converting Queries to Teradata SQL
Converting Queries to Set Processing manipulated. For example, Teradata queue tables are created using DDL and manipulated using SQL. Oracle queue tables are created and manipulated using PL/SQL, JMS, and Oracle
APIs.
You must translate existing queue table requirements and management into Teradata queue tables and processes.
Reference Information
Information on...
syntax and options for CREATE TABLE
(Queue Table Form) strategy for using queue tables manipulating data in queue tables using:
•
INSERT (push)
•
SELECT AND CONSUME (pop)
•
SELECT (peek)
•
DELETE, UPDATE, or MERGE
Is available in...
SQL Data Definition Language Syntax and Examples,
B035-1144
SQL Data Definition Language Detailed Topics, B035-
1184
SQL Data Manipulation Language, B035-1146
Converting Queries to Set Processing
For non-Teradata database systems, business processes often are broken into multiple, simple
SQL queries that use sequential, row-at-a-time, cursor processing. Although coding this type of SQL query is easier, it may not be the most efficient processing method.
Teradata Database uses parallel architecture and set processing to simultaneously update sets of rows, which is not possible using row-at-a-time cursor processing.
When migrating queries to Teradata or developing new queries, use SQL constructs that take advantage of Teradata parallel processing.
Instead of using...
IF statements nested loops nested procedures or functions
Use...
CASE operations or predicates joins joins or subqueries
Teradata Data Warehouse Appliance 2800 Implementation Guide 207
Chapter 7: Converting Queries to Teradata SQL
Converting Queries to Set Processing
Example 1 Conditional Insert
The following example uses a cursor to insert data into the Depositors table. The INSERTs are processed one row at a time.
cursor A is SELECT Acct, Name, Amt FROM Deposits;
FOR A_Rec IN A LOOP BEGIN
IF A_Rec.Amt > 0 THEN
IF A_Rec.Name = ' ' THEN A_Rec.Name = ‘UNKNOWN’;
END IF;
INSERT INTO Depositors (Account, Name) VALUES
(A_Rec.Acct, A_Rec.Name);
END IF;
END;
The SQL in the previous example can be rewritten using a CASE statement. CASE expressions help increase performance by returning multiple results in a single pass over the data rather than making multiple passes over the data.
INSERT INTO Depositors (Account, Name)
SELECT A.Acct, CASE A.Name
WHEN ' '
THEN ‘UNKNOWN’
FROM Deposits A
WHERE A.Amt > 0;
END
ELSE A.Name
Example 2 IF… ELSIF… ELSE
The following example uses a FOR loop and an IF...ELSIF...ELSE statement to set the value for
GL_Acct. This serial operation INSERTs data into the Gen_Ledger table one row at a time.
cursor Dep is SELECT Amt, D_date, AcctNum FROM Deposits;
BEGIN
FOR Deposits_Rec IN Dep LOOP BEGIN acct_num := Deposits_Rec.AcctNum;
IF acct_num = '999999990' THEN
GL_Acct := 'SLUSH';
ELSIF acct_num = '999999991' THEN
GL_Acct := 'MY SWISS BANK ACCT';
ELSIF acct_num = '999999992' THEN
GL_Acct := 'BLDG FUND';
ELSE
GL_Acct := 'CUST DEPOSIT';
VALUES (Deposits_rec.Amt, GL_Acct, Deposits_rec.D_date);
END LOOP;
END;
END IF;
INSERT INTO Gen_Ledger (Amount, Acct, DDate)
You can rewrite the SQL using a CASE statement, which simultaneously processes multiple rows.
INSERT INTO Gen_Ledger (Amount, Acct, DDate)
SELECT
DEP.Amt
,CASE WHEN DEP.AcctNum = '999999990' THEN 'SLUSH'
WHEN DEP.AcctNum = '999999991' THEN 'MY SWISS BANK ACCT'
208 Teradata Data Warehouse Appliance 2800 Implementation Guide
Chapter 7: Converting Queries to Teradata SQL
Converting PL/SQL Functions
WHEN DEP.AcctNum = '999999992' THEN 'BLDG FUND'
END
ELSE 'CUST DEPOSIT'
,DEP.D_date
FROM Deposits DEP;
Example 3 Nested Loop
The following Oracle SQL uses a nested FOR loop to update the Accts table. This serial operation cycles through the loops one row at a time.
acct_bal NUMBER(9,2); acct_num CHAR(9); cursor TXN_CUR is SELECT Amt, AcctNum
FROM Acct_Transactions
WHERE AcctNum = acct_num; cursor ACCT_CUR is SELECT AcctNum, acct_balance FROM Accts;
BEGIN
FOR acct_rec IN ACCT_CUR LOOP BEGIN acct_num := acct_rec.AcctNum; acct_bal := acct_rec.acct_balance;
FOR txn_rec IN TXN_CUR LOOP BEGIN acct_bal := acct_bal + txn_rec.Amt;
WHERE AcctNum = acct_num;
END LOOP;
END;
END LOOP;
UPDATE Accts SET acct_balance = acct_bal
You can rewrite the SQL using a subquery, which processes multiple rows simultaneously.
UPDATE Accts
SET acct_balance = acct_balance + Txn_Sum.total_amt
FROM ( SELECT AcctNum, SUM(Amt) FROM Acct_Transactions
GROUP BY 2
) Txn_Sum (acct, total_Amt)
WHERE Accts.AcctNum = Txn_Sum.acct
Reference Information
Information on...
CASE expressions
SQL predicates joins subqueries
Is available in...
SQL Functions, Operators, Expressions, and Predicates, B035-1145
SQL Functions, Operators, Expressions, and Predicates, B035-1145
SQL Data Manipulation Language, B035-1146
SQL Fundamentals, B035-1141
Converting PL/SQL Functions
Teradata can process complex relational requests in parallel, so it may be possible to convert a large number of PL/SQL processes to just a few Teradata SQL statements or procedures.
Teradata Data Warehouse Appliance 2800 Implementation Guide 209
Chapter 7: Converting Queries to Teradata SQL
General Considerations for Using Teradata SQL
Consolidation of PL/SQL processes into parallel Teradata SQL can result in a reduction in data processing time, resource usage, and the quantity of code to maintain.
You can migrate Oracle PL/SQL to Teradata by translating it directly to Teradata SQL, and embedding it into the proper vehicle for query execution. You should also convert the SQL to
Teradata set processing. See “Converting Queries to Set Processing” on page 207 .
The following options are available for converting PL/SQL functions for use in Teradata:
•
Translate the function into Teradata SQL and incorporate it into your SQL query.
•
Create a Teradata UDF that provides the same functionality as the PL/SQL function.
•
Translate the function into Teradata SQL and save it as a stored procedure or macro.
Reference Information
Information on...
Is available in...
set processing
UDFs
“Converting Queries to Set Processing” on page 207
“About User-Defined Functions” on page 406
Procedures and External Procedures
“About Procedures and External Procedures” on page 404
creating and using macros
“Working with Macros” on page 223
General Considerations for Using Teradata SQL
•
Teradata does not use a primary index or unique secondary index to process a query unless all of the indexed columns are in the predicate. Partial index access is supported for join indexes and for nonunique secondary indexes.
•
Updating or deleting the most current fetched cursor row using the UPDATE/DELETE …
WHERE CURRENT OF statement is valid in ANSI session mode, but not in Teradata session mode.
•
The COMMIT statement is supported in ANSI session mode only. An error is returned if the COMMIT statement is issued in Teradata session mode.
•
You cannot close a cursor that is not open. Any attempt to close a cursor that is already closed results in an error.
•
The result rows from a query are returned in unsorted order unless you specify the
ORDER BY clause. There is no default sequence for result rows.
•
Be aware of Reserved Word differences between your current database and Teradata.
•
Be aware of differences in the rules for naming database objects.
•
Be aware of possible migration issues related to Unicode characters.
•
Convert Oracle SQL*Plus scripts to BTEQ scripts.
•
Convert Oracle SQL*Loader (sqlldr) scripts to Teradata PT job scripts.
•
ODBC considerations:
210 Teradata Data Warehouse Appliance 2800 Implementation Guide
Chapter 7: Converting Queries to Teradata SQL
Checkpoint
•
Verify that all ODBC functions in an existing application are supported by Teradata
ODBC.
•
Test all DAO or ADO functions used in both Visual Basic and C++ programs.
Reference Information
Information on...
indexing
Is available in...
•
“About Primary Indexes” on page 182
•
“Using Indexes to Improve Query Performance” on page 240
SQL Stored Procedures and Embedded SQL, B035-
1148
•
updating the most current fetched cursor row (UPDATE (Positioned Form))
•
deleting the most current fetched cursor row (DELETE (Positioned Form))
•
closing an open cursor (CLOSE)
ANSI session mode and Teradata session mode
COMMIT statement
ORDER BY clause
Teradata Database reserved words naming database objects
Unicode support
BTEQ scripts
“About Session Modes and Transaction Processing” on page 216
SQL Data Manipulation Language, B035-1146
SQL Fundamentals, B035-1141
Teradata PT job scripts using the ODBC Driver for Teradata with custom and off-the-shelf ODBC applications
International Character Set Support, B035-1125
“Using BTEQ Scripts to Create Database Objects” on page 196
Chapter 15: “Moving Data to and from Teradata
ODBC Driver for Teradata User Guide, B035-2509
Checkpoint
Before leaving Chapter 7: “Converting Queries to Teradata SQL,” make sure that:
Result
Pre-existing data types are converted to Teradata data types.
Built-in functions specific to another RDBMS are converted to Teradata functions.
Reference
“Converting Data Types to Teradata
“Converting Built-in SQL Functions” on page 200
Teradata Data Warehouse Appliance 2800 Implementation Guide 211
Chapter 7: Converting Queries to Teradata SQL
Checkpoint
Result
Hierarchical queries are rewritten in Teradata
SQL syntax.
Queries with outer joins are rewritten using
Teradata SQL syntax.
You know how the NULLS and empty strings in your queries will be interpreted in Teradata.
Nested aggregate operations are converted to
Teradata SQL syntax.
Oracle external tables are converted to Teradata
Database table functions.
Queue tables from another RDBMS are converted into Teradata SQL.
The migrated SQL is taking full advantage of the parallel processing power of Teradata.
PL/SQL is converted to Teradata SQL and takes advantage of the parallelism and set processing features available in Teradata.
You have reviewed and acted upon other SQL application considerations.
Reference
“Converting Hierarchical Joins” on page 203
“Converting Outer Joins” on page 204
“Converting External Tables to Table
“Converting Queue Tables” on page 206
“Converting Queries to Set Processing” on page 207
“Converting PL/SQL Functions” on page 209
“General Considerations for Using
If you do not have these results, return to the section shown in the Reference column and review that procedure.
212 Teradata Data Warehouse Appliance 2800 Implementation Guide
डाउनलोड
विज्ञापन