Sqlserver 轉oracle 那點事....


Sql Server數據類型               Oracle數據類型
Char,Varchar                         Varchar2
Smalllint,int,bigint,bit             int
float/dec/decimal/numeric      NUMBER
Text,image,binary                  blob
Date,time,datetime                 Date

sqlserver oracle 說明
SELECT NAME FROM sysobjects select TABLE_NAME from user_tables 查看表名是否存在
Year() to_char(sysdate,'yyyy') 取年
Month() to_char(sysdate,'mm') 取月
dateadd(mm,1,@begindate) SELECT add_months(to_date('2008/10/31 17:22:49 ','YYYY/MM/DD HH24:MI:SS'),1) FROM dual 加一個月
datepart(week,@SDate-1); select to_char(sysdate - 1,'d')  from dual; 返回當前輸入的日期是周幾,-1代表--中國人的習慣是星期一是每周的第一天
raiserror raise_application_error(-20003,'ddd'); 拋出一個錯誤
substring SUBSTR 截取字符串
Convert CAST(a.id AS VARCHAR); 轉換變量類型
Set NOCOUNT ON set feedback off 關閉影響行提示
SELECT A.NAME
     FROM syscolumns A,
   sysobjects B
      WHERE LOWER(B.NAME) = LOWER(v_TableName)
     AND B.xtype = 'U'
     AND A.id = B.ID
     ORDER BY a.colid;
select * from user_tab_columns where table_name='大寫表名' 索表結構,列名檢
create table #ForeignTableList
每次在過程中建立
CREATE GLOBAL TEMPORARY TABLE Tmp_ForeignTableList
會話級臨時表,建立一次可重復使用表結構,但數據時會話級的,一旦斷開於數據庫的鏈接,表存在,表中數據消失
臨時表
SELECT object_name(b.fkeyid),(SELECT name FROM syscolumns WHERE colid=b.rkey AND id=b.rkeyid)
 FROM sysobjects a
 join sysforeignkeys b on a.id=b.constid
 join sysobjects c on a.parent_obj=c.id
 where a.xtype='f' AND c.xtype='U';
SELECT USER_TAB_COLS.COLUMN_NAME as 列名 ,
USER_TAB_COLS.DATA_TYPE as 數據類型,
USER_TAB_COLS.DATA_LENGTH as 長度,
USER_TAB_COLS.NULLABLE as 是否為空, case
when (SELECT col.column_name FROM user_constraints con, user_cons_columns col where con.constraint_name = col.constraint_name and con.constraint_type='P' and col.table_name = '表名' and col.column_name = USER_TAB_COLS.COLUMN_NAME) = USER_TAB_COLS.COLUMN_NAME THEN 'Y'
ELSE 'N'
END
as 是否主鍵,
case when (select count(*) from user_constraints con, user_cons_columns col, (select t2.table_name,t2.column_name,t1.r_constraint_name from user_constraints t1,user_cons_columns t2 where t1.r_constraint_name=t2.constraint_name and t1.table_name='表名') r where con.constraint_name=col.constraint_name and con.r_constraint_name=r.r_constraint_name and con.table_name='表名' and col.column_name = USER_TAB_COLS.COLUMN_NAME) > 0 then 'Y'
else 'N'
END
as 是否外鍵
, user_col_comments.comments as 備注 FROM USER_TAB_COLS inner join user_col_comments on user_col_comments.TABLE_NAME = USER_TAB_COLS.TABLE_NAME and user_col_comments.COLUMN_NAME=USER_TAB_COLS.COLUMN_NAME and USER_TAB_COLS.TABLE_NAME = '表名' ORDER BY USER_TAB_COLS.COLUMN_ID;
查詢主外鍵
select * from sysindexes where name=ltrim(rtrim(@IndexName)) select * from user_indexes where table='表名' 查詢索引

 注意事項

1語句后一定要加分號[;]

2批量運行過程時,過程結束后要使用[/]

3 select *,0 t ,0 as s from t1;
   一定要改成[select a.*,0 t ,0 as s from t1  a;]這種方式,使用別名.

4對於字符串(原有類似char(2)這樣的字段時要注意)進行比較時最好加rtrim()進行
    where rtrim(char)=rtrim(char)

5 insert tablename(field) select 'value' 應改為 insert into tablename(field) select 'value' from dual;

6 select top 1 * from table where ... 改成 select * from table where rownum=1;

7 動態調用SQL:EXECUTE IMMEDIATE 'select * from table';

8 cast(sum(pricevalue) as dec(12,2)) 轉換成 round(to_number('12.3456'),2)

9 格式化字符串   TO_CHAR('345','000000'); --輸出000345;

10 CASE語句的注意  不能像sqlserver[case fieldname when value1 then ... when value2 then ... else ... end ]
      而是要[case when fieldname=value1 then ... when fieldname=value2 then ...else ... end ]

11日期格式化:原理得到年月自己拼
11.1 to_char得到年月日。拼成yyy.mm.dd
11.2 .to_date,在轉換成日期格式 to_date(to_char(v_CheckDate,'yyyy')||'.'||to_char(v_CheckDate,'mm')||'.'||to_char(v_CheckDate,'dd'),'YYYY.MM.DD')

13測試時打印輸出
begin
dbms_output.put_line(to_char(sysdate,'yyyy'));
end;

14判斷有無數據的方式

declare
 v_temp     NUMBER(1, 0) := 0;
 v_strTableName VARCHAR2(32):='C2';
begin
  select 1 into  v_temp from dual
   where exists ( SELECT TABLE_NAME FROM user_tables WHERE TABLE_NAME = v_strTableName);
    EXCEPTION WHEN OTHERS-- NO_DATA_FOUND
       THEN NULL;
  dbms_output.put_line( v_temp);
end;

 15for循環

begin
    for x in reverse 1..10 loop -- reverse大到小
        DBMS_OUTPUT.PUT_LINE('內:x='||x);
    end loop;
   
    DBMS_OUTPUT.PUT_LINE('endget');
end;
 

 16PLSQL亂碼 修改兩個注冊表的字符集

---查看服務器 ---字符集 select * from V$NLS_PARAMETERS

select userenv('language') from dual;

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb10g_home1]下NLS_LANG
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0]下NLS_LANG

---如果修改了還不行那么看看系統變量里面時候有寫

17異常處理的 

 異常錯誤信息名稱                說明
 
ORA-0001 Dup_val_on_index 違反了唯一性限制
 
ORA-0051 Timeout-on-resource 在等待資源時發生超時
 
ORA-0061 Transaction-backed-out 由於發生死鎖事務被撤消
 
ORA-1001 Invalid-CURSOR 試圖使用一個無效的游標
 
ORA-1012 Not-logged-on 沒有連接到ORACLE
 
ORA-1017  Login-denied 無效的用戶名/口令
 
ORA-1403 No_data_found SELECT INTO沒有找到數據
 
ORA-1422 Too_many_rows SELECT INTO 返回多行
 
ORA-1476 Zero-divide 試圖被零除
 
ORA-1722 Invalid-NUMBER 轉換一個數字失敗
 
ORA-6500 Storage-error 內存不夠引發的內部錯誤
 
ORA-6501 Program-error 內部錯誤
 
ORA-6502 Value-error 轉換或截斷錯誤
 
ORA-6504 Rowtype-mismatch 宿主游標變量與 PL/SQL變量有不兼容行類型
 
ORA-6511 CURSOR-already-OPEN 試圖打開一個已處於打開狀態的游標
 
ORA-6530 Access-INTO-null 試圖為null 對象的屬性賦值
 
ORA-6531 Collection-is-null 試圖將Exists 以外的集合( collection)方法應用於一個null pl/sql 表上或varray上
 
ORA-6532 Subscript-outside-limit 對嵌套或varray索引得引用超出聲明范圍以外
 
ORA-6533 Subscript-beyond-count 對嵌套或varray 索引得引用大於集合中元素的個數.
 


EXCEPTION
   WHEN first_exception THEN  <code to handle first exception >
   WHEN second_exception THEN  <code to handle second exception >
   WHEN OTHERS THEN  <code to handle others exception >
END;

標准的錯誤處理
DECLARE
   v_empno employees.employee_id%TYPE := &empno;
   v_sal   employees.salary%TYPE;
BEGIN
   SELECT salary INTO v_sal FROM employees WHERE employee_id = v_empno;
   IF v_sal<=1500 THEN 
        UPDATE employees SET salary = salary + 100 WHERE employee_id=v_empno; 
        DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'員工工資已更新!');     
   ELSE
        DBMS_OUTPUT.PUT_LINE('編碼為'||v_empno||'員工工資已經超過規定值!');
   END IF;
EXCEPTION
   WHEN NO_DATA_FOUND THEN  
      DBMS_OUTPUT.PUT_LINE('數據庫中沒有編碼為'||v_empno||'的員工');
   WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.PUT_LINE('程序運行錯誤!請使用游標');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END; 
以上可以看出,可以放在跟蹤最后

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM