iDog's Quick Guide to Sybase Stored Procedure
Tutorial
Connect to database (interactive mode):
isql -Sdb_server -Uuser -Ppassword -D db_name
Connect to database, execute some queries and finish:
isql -Sdb_server -Uuser -Ppassword -D db_name << END_OF_CMD
<sql or calling stored procedure>
go
END_OF_CMD
Note: Before 'go' and 'END_OF_CMD' above, no space is allowed.
Check if stored procedure exists
select 1 from sysobjects where name = 'insert_old_future_instrument' and type = 'P'
Create stored procedure
create procedure my_proc
@param1 TYPE1
@param2 TYPE2
as
...
go
Parameter list:
@param_name TYPE [, <more declarations>]
Declare local variable
declare @var_name TYPE
Assign query result to variable
select @my_var = MyField from MyTable where MyKey = 0
Check number of results returned from query
@@rowcount
Condition
if (<condition>)
<do something in one line>
else
<do something else in one line>
if (<condition>)
begin
<do something more in multiple lines>
end
Examples
Example 1
Check if stored procedure exists, if not, create it; if exists, skip. Make it as a shell script.
createStoredProc() {
myProcExistIndicator='MY_PROC_EXIST_INDICATOR'
isProcExist=`isql -Sdb_server -Uuser -Ppwd -D db_name << END_OF_CHECK_PROC
select "$myProcExistIndicator" from sysobjects where name = 'my_proc' and type = 'P'
go
END_OF_CHECK_PROC`
isProcExist=`ec ho $isProcExist | grep $myProcExistIndicator`
if test "x$isProcExist" != "x" ; then # already exists
return
fi
isProcExist=`isql -Sdb_server -Uuser -Ppwd -D db_name << END_OF_CREATE_PROC
create procedure my_proc
@param1 TYPE1,
@param2 TYPE2
as
<body of the stored procedure>
go
END_OF_CREATE_PROC
}
Example 2
Two tables:
articles
- title (key)
- contents
- author_id (foreign key, id of persons table)
persons
- id (key)
- name
- phone
- address
Given data (title, contents, name, phone, address), if article exists in table, then skip it; otherwise insert it in table. Also check if person in table, if not, insert it.
create procedure my_insert_proc
@title TITLE,
@contents CONTENTS,
@author NAME,
@phone PHONE,
@address ADDR
as
/* skip if it exists */
if (select count(*) from articles where title = @title) > 0
begin
print "@title is already in DB. Skip it."
return
end
declare @id ID
/* search for the person */
select @id = id from persons
where name = @name
and phone = @phone
if(@@rowcount = 0)
begin
select @id = (max(id) + 1) from persons
/* it can be null if it's the first one */
if(@id is null)
begin
select @id = 0
end
insert into persons values (
@id,
@name,
@phone,
@address
)
end
insert into articles values (
@title,
@contents,
@id
)
go