2007-06-26

oracle 筆記

TOAD Select View 時,會查詢不到資料
原因一. 因為其環境變數[Org_ID]未給值。
DECLARE
P_ORG_ID VARCHAR2(30);
BEGIN
FND_PROFILE.GET('ORG_ID',P_ORG_ID);
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(P_ORG_ID);
END;

如果還是不行 試試原因二.

環境變數 不可為 NLS_LANG = TRADITIONAL CHINESE_TAIWAN.ZHT16BIG5
改為 NLS_LANG = American_America.ZHT16BIG5
重新開機後 就可以了

================ 2007-08-01

此錯誤: Fatal error: Call to undefined function ocilogon()

是安裝 oracle client 後 php oci8 無法載入問題,只要調整 系統路徑 path 將 c:\php5\;c:\php5\ext\; 調整到最前面 後 重新開機 即可解決。

================ 2007-07-05

sqlplus 無法連上 tns 問題 ORA-12560: TNS:protocol adapter error
原因為 資料庫變更了 原本的 SID 所致
只要在DOS視窗輸入 C:\>set oracle_sid=ora10g 這樣的指令 即可

另外 根本解決之道 就是在 系統環境變數 增加
上面 區塊
ORACLE_SID = ORA10G
NLS_LANG = American_America.ZHT16BIG5

下面 區塊
NLS_LANG = American_America.UTF8

================
這是 oracle 10g 在VISTA下支援多國語系的設定

NLS_CHARACTERSET
AL32UTF8

NLS_NCHAR_CHARACTERSET
UTF8

================
1. sqlplus /nolog
2. SQL> connect / as sysdba
3. SQL> SHUTDOWN IMMEDIATE;
4. SQL> STARTUP MOUNT;
5. SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
6. SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
7. SQL> ALTER DATABASE OPEN;
8. SQL> ALTER DATABASE CHARACTER SET UTF8;
9. SQL> ALTER DATABASE NATIONAL CHARACTER SET UTF8;
10. SQL> SHUTDOWN IMMEDIATE;
11. SQL> STARTUP;

此範例是將語系改為UTF8

Oracle 10g 變更資料庫的 characterset

之前裝起來的 Oracle 10g 竟然放中文字進去會變成一堆問號。

於是下指令看看:

SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';

竟然出現:

PARAMETER
------------------------
VALUE
------------------------
NLS_CHARACTERSET
WE8ISO8859P1

NLS_NCHAR_CHARACTERSET
AL16UTF16

================
NLS_CHARACTERSET
ZHT16MSWIN950

NLS_NCHAR_CHARACTERSET
AL16UTF16
================

主要是這個:NLS_CHARACTERSET

我想要可以放中文,而且是 UTF-8

找到一些適用於 9i 的步驟,試過之後,10g 也適用:

以 sysdba 角色進入 sqlplus 之後執行以下

shutdown immediate;
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET AL32UTF8;
ALTER SESSION SET SQL_TRACE=FALSE;


然重新啟動 oracle 就好了。

當然,這種方式會造成裏面的資料亂掉。應該要先把DB內清空再來做。

P.S. 因應 UTF-8, 環境變數 NLS_LANG 為:TRADITIONAL CHINESE_TAIWAN.AL32UTF8

P.S. 注意:網路上廣為流傳的用這種方法是不正確的: update props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET';
透過前述 "ALTER DATABASE CHARACTER SET" 方式更改 characterset 時,Oracle至少需要更改 12 張 data dictionary,而這種直接更新 props$ 表的方式只完成了其中十二分之一的工作,其?在的完整性隱憂可想而知。

沒有留言: