網頁

顯示具有 Sybase 標籤的文章。 顯示所有文章
顯示具有 Sybase 標籤的文章。 顯示所有文章

2015年6月2日 星期二

Henplus下複製整個Table資料到新的資料庫

前陣子寫了Henplus下使用Alert Table,但想到最好是能下個SQL(使用Henplus的關係)直接複製整個table的資料,最好連建table都不用,看半天後沒想到真的有,只要利用SELECT INTO
henplus> select * into database_name.new_table from old_table;
affected 47186 rows (547 msec) //成功

這麼簡單就搞定建table及放入所有資料。

不過官網文字有個注意事項
WARNING! Be careful about running select into across databases if you have column names that exist in both databases, as this may cause problems.

另外,以官網Back Up Data to a New Table所記載,最好是先用sp_spaceused查詢下資料庫或資料表的使用空間,不過使用henplus只會看到如下的回覆文字,得使用DbVisualizer或其他方式吧,有發現再做更新。
sp_spaceused old_table;
affected 1 rows (50 msec)

注意事項:做這之前要先設定auto-commit為on,否則會一直出現FAILURE: The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'xxxx' database.
henplus>set-session-property auto-commit on;

參考網址:
Back Up Data to a New Table
SQL SELECT INTO 语句

2015年5月18日 星期一

Henplus下使用Alter Table

因為連接sybase的環境只有文字介面,所以使用henplus來操作,不過這次想要新增個欄位,執行了底下的sql後
henplus> alter table test add specs char(2) null;

卻一直出現底下的訊息:
FAILURE: The 'ALTER TABLE' command is not allowed within a multi-statement transaction in the 'db' database.

查了半天,看不出所以然來,似乎跟transaction有關,想到henplus預設auto-commit是off,於是執行了底下的指令
henplus>set-session-property auto-commit on;

用底下的指令查一下設定,只要看到on就成功了
henplus>set-session-property
-----------------+----------------+-----------------------------------------------+
      Name       |     Value      |                  Description                  |
-----------------+----------------+-----------------------------------------------+
 auto-commit     | on             | Switches auto commit                          |
 isolation-level | read-committed | sets the transaction isolation level          |
 read-only       | off            | Switches on read only mode for optimizations. |
-----------------+----------------+-----------------------------------------------+

再執行
henplus> alter table test add specs char(2) null;

回覆,這樣就成功囉~
ok. (13 msec)

=====2015/6/2 新增======

若是要改變column name,使用rename column一直無法成功,只能使用sp_rename這個內建函式,使用方式如下
henplus> sp_rename 'test.specs', 'test.specs2';

回覆如下就成功了
affected 1 rows (119 msec)

=====2015/6/2 新增======

=====2015/6/9 新增======

使用Henplus下複製整個Table資料到新的資料庫所提及的複製方式會有個問題,就是primary key無法跟著複製過去,所以要再加上primary key可以用底下的sql
henplus> alter table test add primary key (id);

=====2015/6/9 新增======

參考網址:
Adaptive Server Enterprise 15.7 > Reference Manual: Commands > Commands > alert table

2014年12月23日 星期二

Sybase學習筆記-查詢table schema

在sybase中,看來不是用describe table來查table的schema設定,google半天看起來是用三個system table來查詢。

主要是用到sysobjects、syscolumns及systypes。

sysobjects主要是記錄有哪些被建立的物件,也包含Talbe,type如下(取自From a Sybase Database, how I can get table description ( field names and types)?):

  • C – computed column
  • D – default
  • F – SQLJ function
  • L – log
  • N – partition condition
  • P – Transact-SQL or SQLJ procedure
  • PR – prepare objects (created by Dynamic SQL)
  • R – rule
  • RI – referential constraint
  • S – system table
  • TR – trigger
  • U – user table
  • V – view
  • XP – extended stored procedure

所以使用下列的sql,就可以查到帳號可以存取的table
SELECT * FROM sysobjects WHERE type = 'U'

而我想查詢的是table中的column的type,所以要合用sysobjects、syscolumns及systypes,如下我要查的是Db_subject
select st.name, sc.name, sc.length from syscolumns sc 
inner join sysobjects so on sc.id = so.id 
inner join systypes st on st.type = sc.type 
where so.name = 'Db_subject'

這樣就可以看到Table的欄位資料了。

=============2015/04/07 更新==================

底下SQL可以更準確的取得

select o.name tableName,'' tableChnName,c.name columnName, '' columnChnName, t.name columnType,
(
case when (t.name='numeric' or t.name='decimal')
then '('+CONVERT(VARCHAR(10),c.prec)+','+CONVERT(VARCHAR(10),c.scale)+')'
else CONVERT(VARCHAR,c.length)
end
) columnLength --如果是數字,則顯示 (precision,scale)
from sysobjects o
inner join syscolumns c on c.id = o.id
inner join systypes t on t.usertype = c.usertype
where o.type = 'U' and o.name in ('表格1名稱', '表格2名稱' );

=======================================

參考網址:
From a Sybase Database, how I can get table description ( field names and types)?

2014年6月22日 星期日

Sybase學習筆記-使用HenPlus下command方式使用Sybase

由於Sybase資料庫保密及系統只能使用文字模式的問題,造成我只能使用command line的方式來查詢資料庫,找半天資料都大多都是要安裝Sybase ASE或iSQL,但又似乎無法只安裝iSQL,雖然有免費的開發版本,但連下載Sybase的軟體的link都要找半天,找到了還要註冊一堆資料,雖然弄好了,但安裝設定一堆有的沒的,我放棄了,最後到Open Source SQL Clients in Java找到了HenPlus。

HenPlus下載連結: http://sourceforge.net/projects/henplus/files/

下載完後,要先用ANT做compiler,要先安裝JDK,下載ANT(Download),ANT下載後直接在家目錄下解壓縮。設定PATH參數

$export PATH=$PATH:~/(剛才解壓縮的ant目錄)/bin

再來將下載的HenPlus解壓縮
$tar jxvf henplus-0.9.8.tar.gz
$cd henplus-0.9.8
$ant jar

在這邊要注意的是,若是用root安裝,可以用ant install,但若是個人使用而已,則用ant jar。

最後compiler好後,就可以用底下的執令來
$cd bin
$./henplus

再來是加入Driver,先列出目前預設的。
Hen*Plus> list-drivers
------------+---------------------------------+---------+-----------------------------------------+
    for     |          driver class           | Version |               sample url                |
------------+---------------------------------+---------+-----------------------------------------+
   Adabas   | de.sag.jdbc.adabasd.ADriver     | [NULL]  | jdbc:adabasd://localhost:7200/work      |
   DB2      | COM.ibm.db2.jdbc.net.DB2Driver  | [NULL]  | jdbc:db2://localhost:6789/foobar        |
 * MySQL    | org.gjt.mm.mysql.Driver         | 5.0     | jdbc:mysql://localhost/foobar           |
   Oracle   | oracle.jdbc.driver.OracleDriver | [NULL]  | jdbc:oracle:thin:@localhost:1521:ORCL   |
   SAP-DB   | com.sap.dbtech.jdbc.DriverSapDB | [NULL]  | jdbc:sapdb://localhost/foobar           |
------------+---------------------------------+---------+-----------------------------------------+

我主要是要sybase,要先找到jconn3(jconn3.jar下載),我是放在henplus-0.9.8/lib底下,然後打底下的命令
Hen*Plus> register sybase com.sybase.jdbc3.jdbc.SybDriver jdbc:sybase:Tds:localhost:xxxx/db
Hen*Plus> list-drivers
loaded drivers are marked with '*' (otherwise not found in CLASSPATH)
------------+---------------------------------+---------+-----------------------------------------+
    for     |          driver class           | Version |               sample url                |
------------+---------------------------------+---------+-----------------------------------------+
   Adabas   | de.sag.jdbc.adabasd.ADriver     | [NULL]  | jdbc:adabasd://localhost:7200/work      |
   DB2      | COM.ibm.db2.jdbc.net.DB2Driver  | [NULL]  | jdbc:db2://localhost:6789/foobar        |
 * MySQL    | org.gjt.mm.mysql.Driver         | 5.0     | jdbc:mysql://localhost/foobar           |
   Oracle   | oracle.jdbc.driver.OracleDriver | [NULL]  | jdbc:oracle:thin:@localhost:1521:ORCL   |
   SAP-DB   | com.sap.dbtech.jdbc.DriverSapDB | [NULL]  | jdbc:sapdb://localhost/foobar           |
 * sybase   | com.sybase.jdbc3.jdbc.SybDriver | 6.0     | jdbc:sybase:Tds:localhost:xxxx/db       |
------------+---------------------------------+---------+-----------------------------------------+

再來連結資料庫,用connect指令
Hen*Plus> connect jdbc:sybase:Tds:localhost:xxxx/db
HenPlus II connecting 
 url 'jdbc:sybase:Tds:localhost:xxxx/db
 driver version 6.0
JZ004: DriverManager.getConnection(..., 属性) 中缺少用户名属性。
============ authorization required ===
Username: xxxx
Password: 

出現底下訊息就表示連結上囉
 Adaptive Server Enterprise - ............
 read uncommitted 
 read committed *
 serializable 
xxxx@sybase:db> 

再來就是用SQL查詢啦~~

參考網址:
HenPlus - JDBC SQL-shell
Open Source SQL Clients in Java

2012年10月18日 星期四

下SQL從Sybase資料庫中Random取得資料

軟體工程師的日子真是一堆有的沒的學不完,可怕的是根本沒時間從頭看到尾,最後加重學不完的壓力,想想我從來沒有好好學過sql,哈哈哈,不過我還是能用

這次的需求是要Random,但不是很想用程式去Random產生,加上我用的是Sybase,並不是很常見的,只好去找找,找到些資料

Sybase
SELECT column FROM table ORDER BY NEWID()

實際使用,發現重覆的機會蠻高的,大概是沒有下seed吧....,查了些資料,大多都用rand(),但下法複雜許多,也許暫時先這麼做,反正最差也就再用程式去random出id,再select

順便列下其他的

MySql
SELECT column FROM table ORDER BY RAND()

PostgreSQL
SELECT column FROM table ORDER BY RANDOM()

MS Sql
SELECT TOP 1 column FROM table ORDER BY NEWID()


參考網址:
SQL to Select a random row from a database table
Sybase: get random records from a table!!