View Single Post

   
  #3 (permalink)  
Old 02-27-2008, 07:11 AM
hicks@bigmailbox.net
 
Posts: n/a
Default Re: Stored procedure can't be found


mike wrote:
> What was the exact command that you (or Control-Centre) used to catalog
> the procedure?


By 'catalog', do you mean create? If so, here is the command used to
create the procedure -

CREATE PROCEDURE TABLE_OWNER.SW_GET_SEQ_TRANS
(
IN @szTableOwner VARCHAR(48), -- table owner
IN @nSeqType INTEGER, -- Type of sequence to retrieve reqid is 1 and
casenum is 2
IN @nSeqSize INTEGER, -- Size of cache for sequences
OUT @nSeqValue BIGINT, -- return for sequence number
OUT @szSQLState VARCHAR(33), -- on error holds the SQL state
OUT @szSQLErr VARCHAR(257) -- on error holds the SQL error
message
)
SPECIFIC SW_GET_SEQ_TRANS
DYNAMIC RESULT SETS 0
NOT DETERMINISTIC
LANGUAGE C
PARAMETER STYLE SQL
NO DBINFO
FENCED
THREADSAFE
MODIFIES SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'ssolite!ssolite_get_sequence'/


>
> What are the owner:group and file permissions for the binary?


-rwxr-xr-x 1 root other 8224 Jun 6 2005 ssolite

>
> In the source-code for the procedure, what is the function definition
> for the stored procedure?


SQL_API_RC SQL_API_FN ssolite_get_sequence
(
char TableOwner[49], /* IN */
sqlint32 *seq_type, /* IN */
sqlint32 *cache_size, /* IN */
sqlint64 *seq_no, /* OUT */
char SQLState[LOCAL_SQL_STATE_SIZE], /* OUT */
char SQLErr[LOCAL_SQL_ERROR_SIZE] /* OUT */
)
{
SQLHANDLE henv, hdbc;
SQLRETURN cliRC;
SQLSMALLINT outlen;
LPTHRD_SEQ_ARG pThrdArg = NULL;
#ifdef WIN32
DWORD tid;
HANDLE hThread;
#else
pthread_t tid;
void *status;
#endif /* #ifdef WIN32 */
char DBAlias[49];

/* initialise returns */
memset (SQLState, '\0', sizeof (SQLState));
memset (SQLErr, '\0', sizeof (SQLErr));
*seq_no = 0;

/* Setup the CLI environment */
cliRC = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if ((cliRC != SQL_SUCCESS) && (cliRC != SQL_SUCCESS_WITH_INFO))
{
*seq_no = -1;
}

if (*seq_no == 0)
{
cliRC = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if ((cliRC != SQL_SUCCESS) && (cliRC != SQL_SUCCESS_WITH_INFO))
{
*seq_no = -2;

/* free the environment handle */
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}

if (*seq_no == 0)
{
/* Issue NULL Connect, because in CLI a statement handle is */
/* required and thus a connection handle and environment handle.
/* A connection is not established; rather the current */
/* connection from the calling application is used. */

/* connect to a data source */
cliRC = SQLConnect(hdbc, NULL, SQL_NTS, NULL, SQL_NTS, NULL,
SQL_NTS);

if (cliRC != SQL_SUCCESS)
{
*seq_no = -3;

/* free hdbc handle */
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);

/* free the environment handle */
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}

/* get the name of the database we are connected to */
if (*seq_no == 0)
{
/* get server name information */
cliRC = SQLGetInfo(hdbc, SQL_DATABASE_NAME, DBAlias, 49, &outlen);

if (cliRC != SQL_SUCCESS)
{
*seq_no = -4;
sql_cleanup(henv, hdbc);
}
}

/* disconnect */
if (*seq_no == 0)
{
sql_cleanup(henv, hdbc);
}

/* allocate arguments and create thread to perform SQL */
if (*seq_no == 0)
{
pThrdArg = (LPTHRD_SEQ_ARG) calloc (sizeof (THRD_SEQ_ARG), 1);

if (!pThrdArg)
{
*seq_no = -30;
}
else
{
pThrdArg->seq_type = *seq_type;
pThrdArg->cache_size = *cache_size;
pThrdArg->lpszTableOwner = TableOwner;
pThrdArg->lpszDBAlias = DBAlias;
pThrdArg->lpszSQLState = SQLState;
pThrdArg->lpszSQLErr = SQLErr;

#ifdef WIN32
hThread = CreateThread(
NULL, // no security attributes
0, // use default stack size
ThreadFunc, // thread function
pThrdArg, // argument to thread function
0, // use default creation flags
&tid); // returns the thread identifier

if (hThread != NULL)
{
WaitForSingleObject (hThread, INFINITE);
CloseHandle (hThread);
#else
if (pthread_create (&tid, NULL, ThreadFunc, (void *) pThrdArg) == 0)
{
pthread_join (tid, &status);
#endif /* #ifdef WIN32 */

/* return thread generate sequence number */
*seq_no = pThrdArg->seq_no;
}
else
{
*seq_no = -31;
}

free (pThrdArg);
}
}

return (0);
}

Reply With Quote