Sponsored Content
Top Forums Shell Programming and Scripting unix capture oracle function error Post 302421636 by durden_tyler on Saturday 15th of May 2010 10:48:10 AM
Old 05-15-2010
Ok, I tested this out in my Linux machine (Fedora 11 with Oracle 11gR2), and am able to reproduce your error.

Very interesting error, but the reason is perfectly credible.

In one sentence, this is what is happening - Oracle returns "*" as a part of its error message; your shell does a "*"-expansion and that results in a listing of files in current directory.

Here's how Oracle throws an exception. (I have your function "test_fn" in my test schema, and it returns a VARCHAR2).

Code:
SQL> 
SQL> -- check the code of TEST_FN in my schema
SQL> select text from user_source where name='TEST_FN' order by line;

TEXT
--------------------------------------------------------------------------------
function test_fn
RETURN varchar2
IS
test_date VARCHAR2(100);
BEGIN

select to_char(sysdate,'DD-MON-YY') into test_date from dual;
return test_date ;
END test_fn;

9 rows selected.

SQL> 
SQL> -- check if there's a function (or any object for that matter) called "TEST_FN1"
SQL> select object_type, object_name, status from user_objects where object_name = 'TEST_FN1';

no rows selected

SQL> 
SQL> -- now try to call the (supposed) function "TEST_FN1"
SQL> declare
  2  x varchar2(20);
  3  begin
  4  x := test_fn1;
  5  end;
  6  /
x := test_fn1;
     *
ERROR at line 4:
ORA-06550: line 4, column 6:
PLS-00201: identifier 'TEST_FN1' must be declared
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored


SQL> 
SQL> -- notice the "*" in the second line of the error message ?
SQL> -- now try another error - assign the return value of "TEST_FN" to a *NUMBER* instead of a *VARCHAR2*
SQL> 
SQL> declare
  2  x number;
  3  begin
  4  x := test_fn;
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 4


SQL> 
SQL> -- notice the "*" in the second line of the error message ?
SQL> 
SQL>

Imagine if that "*" is assigned to a Unix variable. If you try to print it without double-quotes, the shell will expand the "*" to the file list in current directory. (That's the special meaning of "*" to a shell actually.)

I have a very simple testcase here to illustrate this point:

Code:
$ 
$ # First, try out the error condition in the shell
$ echo "declare
> x varchar2(20);
> begin
> x := test_fn1;
> end;
> /
> " | sqlplus -s test/test
x := test_fn1;
     *
ERROR at line 4:
ORA-06550: line 4, column 6:
PLS-00201: identifier 'TEST_FN1' must be declared
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored


$ # This was as expected. The text in blue is being assigned to shell
$ # variable "var" in your script. Let's try something like that -
$ 
$ my_variable=`echo "declare
> x varchar2(20);
> begin
> x := test_fn1;
> end;
> /
> " | sqlplus -s test/test`
$ 
$ # ok, so now the entire error message would've been assigned to "my_variable"
$ # Let's print it with double quotes
$ 
$ echo "Value of my_variable is ==>|$my_variable|<=="
Value of my_variable is ==>|x := test_fn1;
     *
ERROR at line 4:
ORA-06550: line 4, column 6:
PLS-00201: identifier 'TEST_FN1' must be declared
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored|<==
$ 
$ # That's all fine and dandy. 
$ # Note 1 - newlines are printed as they are.
$ # Note 2 - the "*" is printed as it is.
$ # Now try without double quotes. I am printing 3 strings here
$ 
$ echo "Value of my_variable is ==>|" $my_variable "|<=="
Value of my_variable is ==>| x := test_fn1; calltest_fn.ksh create_function.sql file1 file2 file3 ERROR at line 4: ORA-06550: line 4, column 6: PLS-00201: identifier 'TEST_FN1' must be declared ORA-06550: line 4, column 1: PL/SQL: Statement ignored |<==
$ 
$ 
$ # Note 1 - newlines in 2nd string were removed by the *shell*
$ # Note 2 - the first and third strings were printed faithfully
$ # Note 3 - first string is "Value of my_variable is ==>|", third string is "|<=="
$ # Note 4 - the shell started printing the value of "my_variable" till "x := test_fn1", but then it encountered a "*", so it expanded it
$ # Note 5 - and after that it printed "ERROR at line 4:" and so on removing newlines as it went
$ 
$

Moral of the story - always use double quotes when you want to print the value of a shell variable that is assigned the output of an Oracle session.

Here's your modified script tested for a failed execution -

Code:
$ 
$ cat -n calltest_fn.ksh
     1    #!/bin/ksh
     2    #set -x
     3    
     4    var=`sqlplus -s /nolog <<EOF
     5    connect test/test
     6    WHENEVER SQLERROR EXIT FAILURE
     7    WHENEVER OSERROR  EXIT FAILURE
     8    set serveroutput on
     9    set feedback off
    10    set linesize 250
    11    DECLARE
    12    test_var varchar2(100);
    13    BEGIN
    14    test_var:=test_fn1;
    15    dbms_output.put_line(test_var);
    16    END;
    17    /
    18    quit;
    19    EOF`
    20    
    21    echo "Value of var is $var"
    22    
$ 
$ 
$ ./calltest_fn.ksh
Value of var is test_var:=test_fn1;
          *
ERROR at line 4:
ORA-06550: line 4, column 11:
PLS-00201: identifier 'TEST_FN1' must be declared
ORA-06550: line 4, column 1:
PL/SQL: Statement ignored
$ 
$

And tested for a successful execution:

Code:
$ 
$ 
$ cat -n calltest_fn.ksh
     1    #!/bin/ksh
     2    #set -x
     3    
     4    var=`sqlplus -s /nolog <<EOF
     5    connect test/test
     6    WHENEVER SQLERROR EXIT FAILURE
     7    WHENEVER OSERROR  EXIT FAILURE
     8    set serveroutput on
     9    set feedback off
    10    set linesize 250
    11    DECLARE
    12    test_var varchar2(100);
    13    BEGIN
    14    test_var:=test_fn;
    15    dbms_output.put_line(test_var);
    16    END;
    17    /
    18    quit;
    19    EOF`
    20    
    21    echo "Value of var is $var"
    22    
$ 
$ ./calltest_fn.ksh
Value of var is 15-MAY-10
$ 
$

HTH,
tyler_durden
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Capture Oracle return code in shell script

I am using the following code in my shell script list=`sqlplus -s $user/$pwd@$dbms<<EOF WHENEVER SQLERROR EXIT SQL.SQLCODE set pagesize 0 feedback off verify off heading off echo off select * from control_tbl where src_nm=$3 and extrct_nm=$4; exit SQL.SQLCODE; EOF` ERROR=$?... (1 Reply)
Discussion started by: Vikas Sood
1 Replies

2. Solaris

how to capture oracle export log while running as background process

I ran the Oracle 9i export command from a terminal to export out a big table using "exp andrew/password file=andrew.dmp log=andrew.log" From the terminal I can see that the export is running as there is some output from the oracle export job. The export job is not complete yet. When i go check... (4 Replies)
Discussion started by: hippo2020
4 Replies

3. Shell Programming and Scripting

How to capture value in shell variable from oracle sql?

Hi Friends, Do someone know how to capture value in a shell variable from oracle sql? Requirement : In a table we want to count the number of records and want to pass this value to a shell variable where it can be manipulated later. In ksh shell we open oracle connection from sqlplus. For... (1 Reply)
Discussion started by: sourabhsharma
1 Replies

4. Shell Programming and Scripting

how to capture oracle function returning 2 values in unix

i have an oracle function which returns two values, one is the error message if the function encounters anything and another one which returns a number i need to capture both and pass it on to unix shell script how to do it (2 Replies)
Discussion started by: trichyselva
2 Replies

5. Shell Programming and Scripting

Need to capture error of sybase sql in unix

Hi Gurus, I am very new in Unix, I have 1 script, in which I am truncating the table , then BCP the data in Sybase table, and then loading the data from sybase table to sybase table. every thing is working fine, but the problem is with Error. I made some hanges in my insert statement so... (1 Reply)
Discussion started by: aksar
1 Replies

6. Shell Programming and Scripting

Need to capture error of sybase isql in unix

Hi Gurus, I am very new in Unix, I have 1 script, in which I am truncating the table , then BCP the data in Sybase table, and then loading the data from sybase table to sybase table. every thing is working fine, but the problem is with Error. I made some hanges in my insert statement so... (3 Replies)
Discussion started by: aksar
3 Replies

7. Shell Programming and Scripting

Capture rows for a column in file from delete sql -Oracle

Hi, This may not be the right forum but i am hoping someone knows an answer to this. I have to capture rows for a column that was deleted. How can i do that without having to write a select query? delete from myschema.mytable where currentdatetimestamp > columnDate this should delete 5... (4 Replies)
Discussion started by: jakSun8
4 Replies

8. Shell Programming and Scripting

How to capture system() function output in variable

How to capture system() function output in awk variable and the print that awk variable..... (8 Replies)
Discussion started by: bharat1211
8 Replies

9. Homework & Coursework Questions

How to Dynamically Pass Parameter to plsql Function & Capture its Output Value in a Shell Variable?

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: 2. Relevant commands, code, scripts, algorithms: #! /bin/ksh v="ORG_ID" ... (2 Replies)
Discussion started by: sujitdas2104
2 Replies

10. Red Hat

Unable to capture value from function

Hi Experts, Am writing a code which need to check for the previous day date and pickup the file as per the previous day date. Problem: Why variable "YDATE" is empty ? O/S: RHEL 5.6 Shell: BASH Desired O/P: ls -lrt /opt/test/user/atsuser.NHU/out/demon.08272017 When I checked the... (3 Replies)
Discussion started by: pradeep84in
3 Replies
All times are GMT -4. The time now is 02:49 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy