Oracle PL/SQL Language Pocket Reference- P14

50 334 0
Oracle PL/SQL Language Pocket Reference- P14

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Previous: III. Built-In Functions Chapter 11 Next: 11.2 Character Function Examples 11. Character Functions Contents: Character Function Descriptions Character Function Examples A character function is a function that takes one or more character values as parameters and returns either a character value or a number value. The Oracle Server and PL/SQL provide a number of different character datatypes, including CHAR, VARCHAR, VARCHAR2, LONG, RAW, and LONG RAW. In PL/SQL, the three different datatype families for character data are: VARCHAR2 A variable-length character datatype whose data is converted by the RDBMS CHAR The fixed-length datatype RAW A variable-length datatype whose data is not converted by the RDBMS, but instead is left in "raw" form When a character function returns a character value, that value is always of type VARCHAR2 (variable length), with the following two exceptions: UPPER and LOWER. These functions convert to upper- and lowercase, respectively, and return CHAR values (fixed length) if the strings they are called on to convert are fixed-length CHAR arguments. PL/SQL provides a rich set of character functions that allow you to get information about strings and modify the contents of those strings in very high-level, powerful ways. Table 11.1 shows the character functions covered in detail in this chapter. The remaining functions (not covered in this chapter) are specific to National Language Support and Trusted Oracle. Table 11.1: The Built-In Character Functions Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Name Description ASCII Returns the ASCII code of a character. CHR Returns the character associated with the specified collating code. CONCAT Concatenates two strings into one. INITCAP Sets the first letter of each word to uppercase. All other letters are set to lowercase. INSTR Returns the location in a string of the specified substring. LENGTH Returns the length of a string. LOWER Converts all letters to lowercase. LPAD Pads a string on the left with the specified characters. LTRIM Trims the left side of a string of all specified characters. REPLACE Replaces a character sequence in a string with a different set of characters. RPAD Pads a string on the right with the specified characters. RTRIM Trims the right side of a string of all specified characters. SOUNDEX Returns the "soundex" of a string. SUBSTR Returns the specified portion of a string. TRANSLATE Translates single characters in a string to different characters. UPPER Converts all letters in the string to uppercase. Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. 11.1 Character Function Descriptions The following sections briefly describe each of the PL/SQL character functions. 11.1.1 The ASCII function The ASCII function returns the NUMBER code that represents the specified character in the database character set. The specification of the ASCII function is: FUNCTION ASCII (single_character IN VARCHAR2) RETURN NUMBER where single_character is the character to be located in the collating sequence. Even though the function is named ASCII, it will return the code location in whatever the database character set is set to, such as EBCDIC Code Page 500 or 7-bit ASCII. For example, in the 7-bit ASCII character set, ASCII (`a') returns 97. Remember that the collating code for uppercase letters is different from that for lowercase letters. ASCII (`A') returns 65 (in the 7-bit ASCII character set) because the uppercase letters come before the lowercase letters in the sequence. If you pass more than one character in the parameter to ASCII, it returns the collating code for the first character and ignores the other characters. As a result, the following calls to ASCII all return the same value of 100: ASCII ('defg') ==> 100 ASCII ('d') ==> 100 ASCII ('d_e_f_g') ==> 100 11.1.2 The CHR function The CHR function is the inverse of ASCII. It returns a VARCHAR2 character (length 1) that corresponds to the location in the collating sequence provided as a parameter. The specification of the CHR function is: FUNCTION CHR (code_location IN NUMBER) RETURN VARCHAR2 where code_location is the number specifying the location in the collating sequence. The CHR function is especially valuable when you need to make reference to a nonprintable character in your code. For example, the location in the standard ASCII collating sequence for the newline character is ten. The CHR function therefore gives me a way to search for the linefeed control character in a string, and perform operations on a string based on the presence of that control character. You can also insert a linefeed into a character string using the CHR function. Suppose I have to build a report that displays the address of a company. A company can have up to four address strings (in addition to city, state, and zipcode). I need to put each address string on a new line, but I don't want any blank lines embedded in the address. The following SELECT will not do the trick: Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. SELECT name, address1, address2, address3, address4, city || ', ' || state || ' ' || zipcode location FROM company; Assuming each column (report field) goes on a new line, you will end up using six lines per address, no matter how many of these address strings are NULL. For example: HAROLD HENDERSON 22 BUNKER COURT SUITE 100 WYANDANCH, MN 66557 You can use the CHR function to suppress these internal blank lines as follows: SELECT name || DECODE (address1, NULL, NULL, CHR (10) || address1) || DECODE (address2, NULL, NULL, CHR (10) || address2) || DECODE (address3, NULL, NULL, CHR (10) || address3) || DECODE (address4, NULL, NULL, CHR (10) || address4) || CHR (10) || city || ', ' || state || ' ' || zipcode FROM company; Now the query returns a single formatted column per company. The DECODE statement offers IF-THEN logic within SQL and executes as follows: "If the address string is NULL then concatenate NULL; otherwise insert a linefeed character. Then concatenate the address string." In this way, blank address lines are ignored. If I now use Wrap on the report field which holds this string, the address will be scrunched down to: HAROLD HENDERSON 22 BUNKER COURT SUITE 100 WYANDANCH, MN 66557 11.1.3 The CONCAT function The CONCAT function concatenates by taking two VARCHAR2 strings and returning those strings appended together in the order specified. The specification of the CONCAT function is: FUNCTION CONCAT (string1 IN VARCHAR2, string2 IN VARCHAR2) RETURN VARCHAR2 CONCAT always appends string2 to the end of string1. If either string is NULL, CONCAT returns the non-NULL argument all by its lonesome. If both strings are NULL, CONCAT returns NULL. Here are Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. some examples of uses of CONCAT: CONCAT ('abc', 'defg') ==> 'abcdefg' CONCAT (NULL, 'def') ==> 'def' CONCAT ('ab', NULL) ==> 'ab' CONCAT (NULL, NULL) ==> NULL I have a confession to make about CONCAT: I have never used it once in all my years of PL/SQL coding. In fact, I never even noticed it was available until I did the research for this book. How can this be? Did I never have to concatenate strings together in my programs? No, I certainly have performed many acts of concatenation in my time. Surprisingly, the answer is that PL/SQL (and the Oracle RDBMS) offers a second concatenation operator -- the double vertical bars (||). This operator is much more flexible and powerful and is easier to use than CONCAT. 11.1.4 The INITCAP function The INITCAP function reformats the case of the string argument, setting the first letter of each word to uppercase and the remainder of the letters in that word to lowercase. A word is a set of characters separated by a space or nonalphanumeric characters (such as # or _ ). The specification of INITCAP is: FUNCTION INITCAP (string_in IN VARCHAR2) RETURN VARCHAR2 Here are some examples of the impact of INITCAP on your strings: ● Shift all lowercase to mixed case: INITCAP ('this is lower') ==> 'This Is Lower' ● Shift all uppercase to mixed case: INITCAP ('BIG>AND^TALL') ==> 'Big>And^Tall' ● Shift a confusing blend of cases to consistent initcap format: INITCAP ('wHatISthis_MESS?') ==> 'Whatisthis_Mess?' ● Create Visual Basic-style variable names (I use REPLACE, explained later, to strip out the embedded spaces). REPLACE (INITCAP ('ALMOST_UNREADABLE_VAR_NAME'), '_', NULL) ==> 'AlmostUnreadableVarName' When and why would you use INITCAP? Many Oracle shops like to store all character string data in the database, such as names and addresses, in uppercase. This makes it easier to search for records that match Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. certain criteria. The problem with storing all the data in uppercase is that, while it is a convenient "machine format," it is not particularly readable or presentable. How easy is it to scan a page of information that looks like the following? CUSTOMER TRACKING LIST - GENERATED ON 12-MAR-1994 LAST PAYMENT WEDNESDAY: PAUL JOHNSON, 123 MADISON AVE - $1200 LAST PAYMENT MONDAY: HARRY SIMMERSON, 555 AXELROD RD - $1500 It is hard for the eye to pick out the individual words and different types of information; all that text just blends in together. Furthermore, solid uppercase simply has a "machine" or even "mainframe" feel to it; you'd never actually type it that way. A mixture of upper- and lowercase can make your output much more readable and friendly in appearance: Customer Tracking List - Generated On 12-Mar-1994 Last Payment Wednesday: Paul Johnson, 123 Madison Ave - $1200 Last Payment Monday: Harry Simmerson, 555 Axelrod Rd - $1500 Can you see any problems with using INITCAP to format output? There are a couple of drawbacks to the way it works. First, as you saw earlier with the string "BIG AND TALL", INITCAP is not very useful for generating titles, since it doesn't know that little words like "and" and "the" should not be capitalized. That is a relatively minor problem compared with the second: INITCAP is completely ignorant of real-world surname conventions. Names with internal capital letters, in particular, cannot be generated with INITCAP. Consider the following example: INITCAP ('HAMBURGERS BY THE BILLIONS AT MCDONALDS') ==> 'Hamburgers By The Billions At Mcdonalds' Use INITCAP with caution when printing reports or displaying data, since the information it produces may not always be formatted correctly. 11.1.5 The INSTR function The INSTR function searches a string to find a match for the substring and, if found, returns the position, in the source string, of the first character of that substring. If there is no match, then INSTR returns 0. In Oracle7, if nth_appearance is not positive (i.e., if it is 0 or negative), then INSTR always returns 1. In Oracle8, a value of 0 or a negative number for nth_appearance causes INSTR to raise the VALUE_ERROR exception. The specification of the INSTR function is: FUNCTION INSTR (string1 IN VARCHAR2, string2 IN VARCHAR2 [,start_position IN NUMBER := 1 Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [, nth_appearance IN NUMBER := 1]]) RETURN NUMBER where string1 is the string searched by INSTR for the position in which the nth_appearance of string2 is found. The start_position parameter is the position in the string where the search will start. It is optional and defaults to 1 (the beginning of string1). The nth_appearance parameter is also optional and also defaults to 1. Both the start_position and nth_appearance parameters can be literals like 5 or 157, variables, or complex expressions, as follows: INSTR (company_name, 'INC', (last_location + 5) * 10) If start_position is negative, then INSTR counts back start_position number of characters from the end of the string and then searches from that point towards the beginning of the string for the nth match. Figure 11.1 illustrates the two directions in which INSTR searches, depending on the sign of the start_position parameter. Figure 11.1: Forward and reverse searches with INSTR I have found INSTR to be a very handy function -- especially when used to the fullest extent possible. Most programmers make use of (and are even only aware of) only the first two parameters. Use INSTR to search from the end of the string? Search for the nth appearance, as opposed to just the first appearance? "Wow!" many programmers would say, "I didn't know it could do that." Take the time to get familiar with INSTR and use all of its power. Let's look at some examples of INSTR. In these examples, you will see all four parameters used in all their permutations. As you write your own programs, keep in mind the different ways in which INSTR can be used to extract information from a string; it can greatly simplify the code you write to parse and analyze character data. ● Find the first occurrence of archie in "bug-or-tv-character?archie": Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. INSTR ('bug-or-tv-character?archie', 'archie') ==> 21 The starting position and the nth appearance both defaulted to 1. ● Find the first occurrence of archie in the following string starting from position 14: INSTR ('bug-or-tv-character?archie', 'ar', 14) ==> 21 In this example I specified a starting position, which overrides the default of 1; the answer is still the same though. No matter where you start your search, the character position returned by INSTR is always calculated from the beginning of the string. ● Find the second occurrence of archie in the following string: INSTR ('bug-or-tv-character?archie', 'archie', 1, 2) ==> 0 There is only one archie in the string, so INSTR returns 0. Even though the starting point is the default, I cannot leave it out if I also want to specify a nondefault nth appearance (2 in this case, for "second occurrence"). ● Find the second occurrence of "a" in "bug-or-tv-character?archie": INSTR ('bug-or-tv-character?archie', 'a', 1, 2) ==> 15 The second "a" in this string is the second "a" in "character," which is in the fifteenth position in the string. ● Find the last occurrence of "ar" in "bug-or-tv-character?archie". INSTR ('bug-or-tv-character?archie', 'ar', -1) ==> 21 Were you thinking that the answer might be 6? Remember that the character position returned by INSTR is always calculated from the leftmost character of the string being position 1. The easiest way to find the last of anything in a string is to specify a negative number for the starting position. I did not have to specify the nth appearance (leaving me with a default value of 1), since the last occurrence is also the first when searching backwards. ● Find the second-to-last occurrence of "a" in "bug-or-tv-character?archie": INSTR ('bug-or-tv-character?archie', 'a', -1, 2) ==> 15 No surprises here. Counting from the back of the string, INSTR passes over the "a" in archie, because that is the last occurrence, and searches for the next occurrence. Again, the character position is counted from the leftmost character, not the rightmost character, in the string. Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. ● Find the position of the letter "t" closest to (but not past) the question mark in the following string: bug-or-tv-character?archie tophat: INSTR ('bug-or-tv-character?archie tophat', 't', -14) ==> 17 I needed to find the "t" just before the question mark. The phrase "just before" indicates to me that I should search backwards from the question mark for the first occurrence. I therefore counted through the characters and determined that the question mark appears at the 20th position. I specified -14 as the starting position so that INSTR would search backwards right from the question mark. What? Did I hear you mutter that I cheated? That if I could count through the string to find the question mark, I could just as well count through the string to find the closest "t"? I knew that I couldn't slip something like that by my readers. ● A more general solution to the previous example: It is true that I "cheated." After all, when you are writing a program you usually do not know in advance the value and location of the string through which you are searching. It is likely to be a variable of some sort. It would be impossible to "count my way" to the question mark. Instead I need to find the location of the question mark and use that as the starting position. I need, in short, to use a second, or nested, INSTR inside the original INSTR. Here is a real solution to the problem: search_string := 'bug-or-tv-character?archie tophat'; tee_loc := INSTR (search_string, 't', -1 * (LENGTH (search_string) - INSTR (search_string, '?') +1)); Instead of hardcoding 20 in my call to INSTR, I dynamically calculate the location of the question mark (actually, the first question mark in the string; I assume that there is only one). Then I subtract that from the full length of the string and multiply times -1 because I need to count the number of characters from the end of the string. I then use that value to kick off the search for the closest prior "t". This example is a good reminder that any of the parameters to INSTR can be complex expressions that call other functions or perform their own calculations. This fact is also highlighted in the final INSTR example. ● Use INSTR to confirm that a user entry is valid. In the code below, I check to see if the command selected by the user is found in the list of valid commands. If so, I execute that command: IF INSTR ('|ADD|DELETE|CHANGE|VIEW|CALC|', '|' || cmd || '|') > 0 THEN execute_command (cmd); ELSE Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. DBMS_OUTPUT.PUT_LINE (' You entered an invalid command. Please try again .'); END IF; In this case, I use the concatenation operator to construct the string that I will search for in the command list. I have to append a vertical bar (|) to the selected command because it is used as a delimiter in the command list. I also use the call to INSTR in a Boolean expression. If INSTR finds a match in the string, it returns a nonzero value. The Boolean expression therefore evaluates to TRUE and I can go on with my processing. Otherwise, I display an error message. INSTR's flexibility allows you to write compact code which implements complex requirements. INSTRB is the multiple-byte character set version of INSTR. For single-byte character sets (such as American English), INSTRB returns the same values as INSTR. 11.1.6 The LENGTH function The LENGTH function returns the length of the specified string. The specification for LENGTH follows: FUNCTION LENGTH (string1 VARCHAR2) RETURN NUMBER If string1 is NULL, then LENGTH returns NULL -- not zero (0)! Remember, a NULL string is a "nonvalue." Therefore, it cannot have a length, even a zero length. The LENGTH function, in fact, will never return zero; it will always return either NULL or a positive number. Here are some examples: LENGTH (NULL) ==> NULL LENGTH ('') ==> NULL -- Same as a NULL string. LENGTH ('abcd') ==> 4 LENGTH ('abcd ') ==> 5 If string1 is a fixed-length CHAR datatype, then LENGTH counts the trailing blanks in its calculation. So the LENGTH of a fixed-length string is always the declared length of the string. If you want to compute the length of the nonblank characters in string1, you will need to use the RTRIM function to remove the trailing blanks (RTRIM is discussed later in this chapter). In the following example, length1 is set to 60 and length2 is set to 14. DECLARE company_name CHAR(60) := 'ACME PLUMBING'; length1 NUMBER; length2 NUMBER; BEGIN length1 := LENGTH (company_name); length2 := LENGTH (RTRIM (company_name)); END; Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... your programs if you are not careful and consistent in your handling of such values Previous: III Built-In Functions III Built-In Functions Oracle PL/SQL Programming, 2nd Edition Book Index Next: 11.2 Character Function Examples 11.2 Character Function Examples The Oracle Library Navigation Copyright (c) 2000 O'Reilly & Associates All rights reserved Please purchase PDF Split-Merge on www.verypdf.com... end of the literal string I ran into this requirement when building query-by-example strings in Oracle Forms If the user enters a string with a single quote in it, such as: Customer didn't have change and then I concatenate that string into a larger string, the resulting SQL statement (created dynamically by Oracle Forms in Query Mode) fails, because there are unbalanced single quotes in the string You... all remaining occurrences of `@' with `abc'." Voila, as they say in many of the finer restaurants in Paris Now let's pull apart this single, rather complex statement into separate PL/SQL steps which correspond to my "natural language" description: r Replace all occurrences of "abc" with the special character "@" (which I am assuming does not otherwise appear in the string) Notice that this only affects... more') ==> 'SHORT LITTLE LETTERS NO MORE' UPPER ('123abc') ==> '123ABC' UPPER and its partner in case conversion, LOWER, are useful for guaranteeing a consistent case when comparing strings PL/SQL is not a case-sensitive language as concerns its own syntax and names of identifiers It is sensitive to case, however, in character strings, whether found in named constants, literals, or variables The string... ('BIG FAT LETTERS') ==> 'big fat letters' LOWER ('123ABC') ==> '123abc' LOWER and its partner in case conversion, UPPER, are useful for guaranteeing a consistent case when comparing strings PL/SQL is not a case-sensitive language with regard to its own syntax and names of identifiers It is sensitive to case, however, in character strings, whether found in named constants, literals, or variables The string... separate lines, depositing those separate lines into a PL/SQL table The procedure also contains calls to the built-in DBMS_OUTPUT package so it can display a trace of the way it performs the analysis to break apart the long text [2] This example, including the wonderful test script, was provided by David Thompson It contains a number of features of PL/SQL covered later in this book, including built-in... opposed to semantics (the way a word is spelled).[1] SOUNDEX returns a character string which is the "phonetic representation" of the argument The specification of the SOUNDEX function is as follows: [1] Oracle Corporation used the algorithm in The Art of Computer Programming, Volume 3, by Donald Knuth, to generate the phonetic representation FUNCTION SOUNDEX (string1 IN VARCHAR2) RETURN VARCHAR2 Here... examples of the effect of TRANSLATE: TRANSLATE ('abcd', 'ab', '12') ==> '12cd' TRANSLATE ('12345', '15', 'xx') ==> 'x234x' TRANSLATE ('grumpy old possum', 'uot', '%$*') ==> $ld p$ss%m' 'gr%mpy TRANSLATE ('my language needs the letter e', 'egms', 'X') ==> 'y lanuaX nXXd thX lXttXr X'; TRANSLATE ('please go away', 'a', NULL) ==> NULL You can deduce a number of the usage rules for TRANSLATE from the above examples,... variables The string "ABC" is not the same as "abc", and this can cause problems in your programs if you are not careful and consistent in your handling of such values 11.1.8 The LPAD function By default, PL/SQL strips all trailing blanks from a character string unless it is declared with a fixedlength CHAR datatype There are occasions, however, when you really want some spaces (or even some other character)... parse the statement To replace the single quote with a wild card, you would code: criteria_string := REPLACE (criteria_string, '''', '_'); That's right! Four single quotes in sequence are required for PL/SQL to understand that you want to search for one single quote in the criteria string The first quote indicates the start of a literal The fourth quote indicates the end of the string literal The two . value. The Oracle Server and PL/SQL provide a number of different character datatypes, including CHAR, VARCHAR, VARCHAR2, LONG, RAW, and LONG RAW. In PL/SQL, . functions (not covered in this chapter) are specific to National Language Support and Trusted Oracle. Table 11.1: The Built-In Character Functions Please purchase

Ngày đăng: 07/11/2013, 19:15

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan