程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase教程 >> SYBASE數據庫操作筆記

SYBASE數據庫操作筆記

編輯:SyBase教程

SYBASE 數據庫操作筆記(轉自MaYong)
 
數據庫表名、列名(執行嚴格的大小寫)
數據庫表名、列名識別大小寫區分(即表名是大寫 查詢時小寫就錯誤)
大小寫敏感的問題是因為字符集影響的,改為UTF8字符集後問題解決。
 
SYBASE數據庫的缺陷(版本SYBASE ASE 15.5)(目前在使用過程中發現的數據庫本身的缺陷)
1.創建表是設置列的默認值是不會檢測的(例如一列字段的數據類型為VARCHAR,默認值可以設置為數字2,可以正常創建表成功;但是當插入數據時(不給此列插入值)就報錯啦,不能正常插入數據。)可能數據庫創建表時沒有去驗證默認值吧。
解決方案只能是自己檢查好創建語句,嚴格遵守默認值的數據類型。
2.兼容性:不會自動轉換數據類型,與上面問題類似,INT型不能插入字符型的('1'),反之一樣。這是數據庫的嚴謹性可以理解,呵呵。
3.創建表與對表操作的語句不能直接放到循環或者判斷語句中,
SYSBASE是先執行創建表的語句(看來創建表的待遇基本不是一般的高啊),
然後才執行條件的判斷,這點壓根不符合程序的邏輯性。(不知SYBASE數據庫的工程師們是怎麼想的)
解決方案,是再創建一個存儲過程,將要創建的表明傳給他,在判斷或循環是調用此存儲過程。
4.還有一些小問題暫時就不說啦。
 
--查詢數據庫中用戶表的名稱
SELECT name FROM sysobjects WHERE type='U' order by name
 
--查詢數據庫中存儲過程的名稱
SELECT name FROM sysobjects WHERE type = 'P'
 
--查詢數據庫中函數的名稱
SELECT name FROM sysobjects WHERE type='SF'
 
--執行存儲過程:exec 存儲過程名稱 第一個參數,第二個參數
exec dbo.Pro_CreateIndex js_seqsql, ssql_type
 
--查詢表的全部索引OBJECT_ID('表名') indid>0為索引類型
SELECT name FROM sysindexes WHERE id = OBJECT_ID('js_seqsql') and indid>0
 
--刪除索引 表名.索引名稱
DROP INDEX js_seqsql.js_seqsql_idx_ssql_type
 
--創建索引CREATE NONCLUSTERED INDEX 索引名稱ON 表名(列名)
CREATE NONCLUSTERED INDEX js_seqsql_idx_ssql_type ON js_seqsql(ssql_type)
 
--字符串替換
str_Replace(原字符串,'要替換的字符','新字符')
 
--判斷表是否存在
SELECT OBJECT_ID('js_jobs')
SELECT 1 FROM sysobjects o, sysusers u WHERE o.uid=u.uid AND o.name = 'WARNINFO201103' AND u.name = 'dbo' AND o.type = 'U'
 
--Sybase數據庫錯誤代碼:其中DESCRIPTION列即為錯誤描述,@ERROR為錯誤代碼編號,可以自行修改查詢。
SELECT * FROM MASTER.DBO.SYSMESSAGES WHEREERROR=@ERROR
 
 
 
 
-- =============================================
-- Author:  MaYong
-- Create date: 2011-01-05
-- Description: 批量創建索引
-- 執行示例:exec dbo.Pro_CreateIndex  表名,列名
-- =============================================
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'Pro_CreateIndex' AND type = 'P')
   DROP PROCEDURE Pro_CreateIndex
GO
 
Create proc Pro_CreateIndex
(
@TableType  varchar(40),   --表名
@IndexName  varchar(150)   --索引名稱
)
--With ENCRYPTION
AS
 
 declare
  @TableName varchar(80),
  @NewIndex  varchar(150)
 
 declare tableName_Cursor CURSOR FOR
  select name from dbo.sysobjects where name like @TableType+'%' and type='U' order by name
 
 set @NewIndex = 'idx_'+str_Replace(@IndexName,',','_')
 Open tableName_Cursor
 Fetch next from tableName_Cursor into @TableName
 
 if @@FETCH_STATUS <> 0
 begin
  DEALLOCATE tableName_Cursor
  RollBack TRANSACTION
  Return 0
 end
 
 while @@FETCH_STATUS = 0
 BEGIN 
   --判斷索引是否存在 存在則刪除
   declare @OldIndex varchar(150)
   set @OldIndex=@TableName+'_'+@NewIndex
      IF EXISTS (SELECT 1 FROM sysindexes WHERE id = OBJECT_ID(@TableName) AND name = @OldIndex  and indid>0)
   --IF EXISTS (SELECT 1 FROM sysindexes i, sysobjects o, sysusers u WHERE  o.id = i.id AND o.uid = u.uid AND i.name = @OldIndex AND u.name = 'dbo' AND o.name = @TableName AND i.indid > 0)
            BEGIN
             setuser 'dbo'
                declare @drop_sql varchar(1000)
    select @drop_sql='DROP INDEX '+ @TableName + '.' +  @OldIndex
    exec (@drop_sql)
    print @drop_sql
            END
            --異常處理
            IF (@@error != 0)
            BEGIN
             PRINT 'Error Drop Index :', @OldIndex
             SELECT syb_quit()
            END
   --創建索引
   declare @index_sql varchar(1000)
   select  @index_sql='CREATE NONCLUSTERED INDEX'+@TableName+'_'+@NewIndex
         +' ON'+@TableName+'('+@IndexName+')'
   BEGIN   
    exec   (@index_sql)    
    print   @index_sql
   END
            --異常處理
 
            IF (@@error != 0)
            BEGIN
                PRINT 'Error CREATING Index出差語句:', @index_sql
                PRINT @@error
             Fetch next from tableName_Cursor into @TableName
    CONTINUE
            END
 
  Fetch next from tableName_Cursor into @TableName
 END
 
      
 Close tableName_Cursor
 DEALLOCATE tableName_Cursor
         --異常處理
            IF (@@error != 0)
            BEGIN
                PRINT 'Error CREATING Index出差語句:', @index_sql
                PRINT @@error
            END
GO
 
----------------------------發現問題---------------------------------
INDEX是SYBASE數據庫的關鍵字,創建與查詢此字段時必須加[]才行,建議修改
--業務類型對應承載方式、性能指標表
PRINT '<<<<< CREATING Table - "SERVICE2NORM" >>>>>'
IF OBJECT_ID('SERVICE2NORM') IS NOT NULL
 drop table SERVICE2NORM
GO
 
CREATE TABLE  SERVICE2NORM(
  ID INT  IDENTITY, --標識,自動+1
  SERVICETYPE VARCHAR(3), --主業務類型
  SUBSERVICETYPE VARCHAR(2), --子業務類型
  EXPSERVICETYPE VARCHAR(3), --拓展業務類型
  LOCALNET TINYINT, --主叫承載方式
  NORMID INT, --性能指標
  TYPE TINYINT, --關注指標,0:關注(暫不使用)
  [INDEX] INT, --序號.0:主性能;
 
PRIMARY KEY CLUSTERED ( ID )  ON 'default'
)
-----------------------------------------------------------------------
 
您正在看的sybase教程是:如何更改服務器的字符集為cp936。
 
(這裡SYBASE的安裝路徑為c:\sybase) 1.c:\>cd \sybase\charsets\cp936 2.c:\sybase\charsets\cp936> charset -Usa -Psa_pass -Sserver_name binary.srt cp936 3.在SQL環境中1>select name,id from syscharsets 2>go 找到name為cp936對應的id(假設為117) .1>sp_configure "default character set id,117 2>go 5.重啟server兩次
(注:第一次啟動後,server會自動宕掉,需要第二次重啟後才能使用)
 
 
如何修改Syabse服務器端的默認字符集
 
 
以Windows操作系統Sybase12.5為例:
 
首先說明察看服務端字符集和客戶端字符集的方法:
 
查看服務器端字符集:
 
在isql環境中執行:
 
1>sp_helpsort
 
2> go
 
查看客戶端字符集:
 
在isql環境中執行:
 
1> select @@client_csname
 
2> go
 
修改服務端字符集方法:
 
假設sybase安裝目錄為$sybase$
 
◆1.轉到$sybase$\ASE-12_5\bin目錄
 
執行命令:charset -Usa -P binary.srt iso_1
 
◆2.打開isql,執行下面的SQL查詢出iso_1對應的id
 
select id , name from syscharsets where name = 'iso_1'
 
go
 
假設查詢結果為1
 
執行下面語句設定默認字符集
 
sp_configure 'default char',1 --可能有誤,以上面的查詢結果為准
 
go
 
關閉ASE
 
shutdown
 
go
 
◆3.重新啟動sybase服務兩次(第一次啟動會失敗),啟動服務。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved