有沒有什麼辦法可以在Oracle 10g中將十進制轉換爲二進制或二進制轉換爲十進制而不必先定義一個函數?我有限的數據庫訪問(僅限SELECT),我在網上找到的所有解決方案似乎涉及CREATE FUNCTION
,這對我不起作用。沒有函數的PL/SQL base轉換
回答
可以執行PL/SQL中的腳本的SQLPlus像這樣:
declare
procedure bin_2_dec(/*some parameters here*/) is
begin
/*do computation and print result*/
end;
begin
bin_2_dec('11110000');
end;
/
我不知道,但我不認爲該函數將永久保存在數據庫中創建,我認爲它只會在劇本期間臨時存在,所以這可能工作。這值得一試,對吧? ;)
或者,如果這不起作用,你可以SELECT ... from dual
轉換,雖然這可能會很尷尬,並且只會在你知道數字的位數時起作用 - 也許(如果我想把它放在一起可以得到幾分鐘,如果可能的話)。
如果十六進制足夠好,那麼TO_CHAR和TO_NUMBER可以工作:
SQL> select to_char(31, '0x') from dual;
TO_
---
1f
SQL> select to_number('1f', '0x') from dual;
TO_NUMBER('1F','0X')
--------------------
31
您可以使用RAWTOHEX()
和HEXTORAW()
功能,使十六進制到二進制轉換爲好。
專門研究SQL疑難雜症的Frank Zhou爲此問題設計了一個純粹的SQL解決方案。你可以在his OraQA site找到它。但要注意的是:確實是粗糙。
更新
原文鏈接OraQA被打破:The Wayback Machine has an archived version here。
這確實是扭曲的。我喜歡。 ;) – FrustratedWithFormsDesigner 2010-06-21 20:05:47
鏈接已死亡。解決方案可能與此相同 - https://asktom.oracle.com/pls/apex/f?p=100:11:::YES:RP:P11_QUESTION_ID:7041297073738 – jva 2016-03-10 13:35:33
@jva - 感謝您的提示。我添加了一個存檔鏈接。 FZ解決方案比較複雜,因爲他不只是做十六進制。 – APC 2016-03-12 08:19:54
粗,但對於十進制到二進制直正解:
SELECT REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(TO_CHAR (100,'FMxxx'),
'0','0000'),
'1','0001'),
'2','0010'),
'3','0011'),
'4','0100'),
'5','0101'),
'6','0110'),
'7','0111'),
'8','1000'),
'9','1001'),
'A','1010'),
'B','1011'),
'C','1100'),
'D','1101'),
'E','1110'),
'F','1111')
FROM DUAL;
二進制到十進制將是棘手。您可以使用connect by
將字符串拆分爲4個字符的分段,然後將它們以相似的方式進行轉換,然後將它們連接在一起(第二個connect by
使用SYS_CONNECT_BY_PATH
?),但這對我今晚的工作有些過於單調乏味。
關於第二個想法,這裏的二進制到十進制的解決方案(我爲connect by
問題吸盤):
SELECT TO_NUMBER(
REPLACE (
SYS_CONNECT_BY_PATH (octet, '!'),
'!', ''),
'xxxxxx')
FROM (SELECT CASE SUBSTR
(LPAD (a,
CEIL (LENGTH(a)/4)*4, '0'),
(LEVEL-1)*4+1, 4)
WHEN '0000'
THEN '0'
WHEN '0001'
THEN '1'
WHEN '0010'
THEN '2'
WHEN '0011'
THEN '3'
WHEN '0100'
THEN '4'
WHEN '0101'
THEN '5'
WHEN '0110'
THEN '6'
WHEN '0111'
THEN '7'
WHEN '1000'
THEN '8'
WHEN '1001'
THEN '9'
WHEN '1010'
THEN 'A'
WHEN '1011'
THEN 'B'
WHEN '1100'
THEN 'C'
WHEN '1101'
THEN 'D'
WHEN '1110'
THEN 'E'
WHEN '1111'
THEN 'F'
END AS octet,
LEVEL AS seq,
CEIL (LENGTH(a)/4) AS max_level
FROM (SELECT '101010101010101010' AS a
FROM DUAL)
CONNECT BY LEVEL <= CEIL(LENGTH(a)/4))
WHERE LEVEL = max_level
CONNECT BY PRIOR seq = seq-1
此解決方案僅適用於一行在作爲當前寫入時間。要使其與多行一起工作,您需要在最外面的connect by
中添加某種唯一標識符。
不錯的努力 - 很酷。 – 2014-02-06 05:12:42
我在Oracle中使用CONNECT BY
在簡單的SELECT
語句中將十進制轉換爲二進制。最後得到了期望的輸出。你可以使用下面,它工作正常。
WITH INPUT AS
(SELECT &N AS X FROM DUAL)
SELECT SUM(MOD(FLOOR(X*POWER(0.5,LEVEL-1)),2)*POWER(10,LEVEL-1)) AS
OUTPUT FROM INPUT CONNECT BY POWER(2,LEVEL-1)<=X;
- 1. PostgreSQL:有沒有函數可以將base-10 int轉換爲base-36字符串?
- 2. 轉換PLSQL函數成爲TSQL
- 3. PLSQL函數來IPV4轉換爲IPV6
- 4. Lua base轉換器
- 5. 在C#中將base-27(或base-X)轉換爲base-10?
- 6. ImportError:在Pyinstaller轉換pygame時沒有名爲base的模塊
- 7. `Base * b = new Base;`vs`Base * b = new Base();`沒有定義我自己的構造函數
- 8. PLSQL中的(+)函數
- 9. 轉換PLSQL函數來處理,利用一個Oracle ARRAY
- 10. PLSQL - 將字符數組轉換爲Varchar2
- 11. PlSql轉換功能問題
- 12. Python內置base-256到base-10轉換,反之亦然?
- 13. 如何將base 2浮點數轉換爲base 10?
- 14. Base-64到Mat轉換opencv
- 15. PLSQL函數聲明
- 16. 有沒有可以將ACAccountTypeIdentifier轉換爲SLServiceType的函數?
- 17. 有沒有像Seq.cast類型推斷的F#轉換函數?
- 18. 帶光標的plsql函數
- 19. 轉換數組轉換爲字符串沒有內置函數PHP
- 20. ORACLE PLSQL函數/觸發器
- 21. 將許多位轉換爲Base 10
- 22. 將BASE-14轉換爲BASE-7的直接方式
- 23. 如何將base-256轉換爲base-N,其中N大於16?
- 24. 將Sum的值轉換爲Base 10
- 25. 如何將沒有實例參數的K函數轉換爲K函數?
- 26. ExtJS:關聯的idProperty的轉換函數沒有觸發
- 27. 有沒有一個PHP函數來轉換這些字符?
- 28. 有沒有辦法在haskell中轉換函數類型?
- 29. 將NSData轉換爲Base-64錯誤
- 30. 有沒有將旋轉矩陣轉換爲加速度矢量的matlab函數?
需要明確的是:我們不能在嵌入匿名塊的SQL語句中使用像這樣聲明的函數。這拋出了PLS-00231,因爲我們只能在SQL語句中使用SQL聲明的函數。 – APC 2010-06-21 16:00:31
不,我想這個函數在SELET語句中是不可用的,但函數/過程*可以從SQLPlus腳本中的PL/SQL中使用*。我不知道腳本中的PL/SQL是否是可行的解決方案。 – FrustratedWithFormsDesigner 2010-06-21 16:05:42