Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 35

0
votes
answers
8 views
+10

使用TO_CHAR在Oracle中進行數字格式化

0

在ORACLE存儲過程中格式化數字的正確方法。使用TO_CHAR在Oracle中進行數字格式化

我需要顯示2位小數的貨幣字段。 預期輸出如下:

  • 0> 0.00
  • 5> 5.00
  • 1253.6> 1253.60
  • 1253.689> 1253.69

下面爲我工作:

select to_char(9876.23 , 'fm999990.00') from dual; 

但這有硬c的問題編了一堆9。如果我給一個更大的數字,它會顯示爲「##############」

有沒有其他方法可以做到這一點?

+0

對於較大的數字,增加格式說明符中的9。 –

+0

我會很感激,如果下來的選民可以解釋爲什麼...... :( – PAVITRA

沙发
0
2

我需要2位小數,顯示貨幣字段。

確保您使用具有適合數據的比例和精度的數字數據類型,而不使用NUMBER而沒有比例和精度。如果你打算存儲美元/歐元/磅/等。那麼Gross World Product是的$ 100,000,000,000,000在2014年的訂單讓我們假設你是不是將要處理超過此[來源請求]那麼你的貨幣列可以是:

NUMBER(17,2) 

如果你得到一個價值大於此值,那麼您需要對您的數據執行完整性檢查,並考慮一個比世界總產品更大的數額是否合理。如果您要將這些值存儲爲例如日元或津巴布韋元,請適當調整比例。

你甚至可以在一個包中定義一個子類:

CREATE PACKAGE currencies_pkg IS 
    SUBTYPE currency_type IS NUMBER(17,2); 

    FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE 
) RETURN VARCHAR2; 
END; 
/

您的代碼格式化,可以這樣:

CREATE PACKAGE BODY currencies_pkg IS 
    FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE 
) RETURN VARCHAR2 
    IS 
    BEGIN 
    RETURN TO_CHAR(currency_value, 'FM999999999999990D00'); 
    END; 
END; 
/

然後,如果你引用的子類型的存儲過程/包,您將無法超過貨幣數據類型的最大大小,而不會引發異常。顯示值的格式模型只需要在一個地方定義,並且由於輸入限於貨幣子類型,所以格式化函數將永遠不會超過強加的比例/精度,並且不能輸出#

CREATE PROCEDURE your_procedure(
    in_value1 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE, 
    in_value2 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE 
) 
IS 
    v_value CURRENCIES_PKG.CURRENCY_TYPE; 
BEGIN 
    -- Do something 
    v_value := in_value1 + in_value2; 
    -- Output formatted value 
    DBMS_OUTPUT.PUT_LINE(CURRENCIES_PKG.formatCurrency(v_value)); 
END; 
/
+1

這是一個合理的論據對我來說。 – PAVITRA

板凳
0
1

爲什麼「硬編碼一堆9」是一個問題? (如果你打算使用TO_CHAR,你需要這麼做)

select to_char(9876.23 , 'fm9999999999999999999990D00') from dual; 

ps;你可能要考慮使用D而不是.(不是每個國家使用.作爲小數點分隔 - D是語言敏感,將使用相應的符號)

0
votes
answers
8 views
+10

Oracle Apex創建存儲過程

0

我對apex和存儲過程非常陌生。這只是我創建的一個簡單示例過程。但它保持輸出「編譯錯誤成功」。希望有人能幫忙,提前感謝。Oracle Apex創建存儲過程

CREATE OR REPLACE PROCEDURE get_client_info AS 
BEGIN 
    select CLIENTID from client 
END get_client_info 
+0

如果您使用APEX的SQL命令窗口創建此,以供將來參考,你可以看到在對象錯誤對象瀏覽器(找到你的程序並點擊「錯誤」標籤)。 –

沙发
0
0

分號;,變量聲明和返回由into條款缺失。外

SQL>set serveroutput on; 
SQL>CREATE OR REPLACE PROCEDURE get_client_info AS 
    v_CLIENTID client.CLIENTID%type; 
BEGIN 
    select CLIENTID into v_CLIENTID from client; 
    dbms_output.put_line(v_CLIENTID); 
END get_client_info; -- no need to use "get_client_info" part here, i mean using "END;" is enough, if you'd like. 
/
SQL>exec get_client_info; 

或返回結果值:請嘗試以下一個

SQL>CREATE OR REPLACE PROCEDURE get_client_info(o_CLIENTID out client.CLIENTID%type) AS 
    BEGIN 
     select CLIENTID into o_CLIENTID from client; 
    END; 
    /
    SQL>var clinfo varchar2; 
    SQL>exec get_client_info(:clinfo); 
    SQL>print clinfo; 
0
votes
answers
7 views
+10

在SQL中嵌套計數

1

我想要計算具有特定SKU的商店(商店1-10)的不同數量。這裏是我的代碼:在SQL中嵌套計數

SELECT distinct COUNT(*) as total_store 
FROM(

    select distinct st.* 
    from (select st.* 
     from store_table st 
)st 

WHERE st.store between 1 and 10 
AND st.sku = 10101 
GROUP BY st.store 
HAVING COUNT(*) >= 1 
)a; 

我不斷收到一個錯誤:

ORA-00979: not a GROUP BY expression 00979. 00000 - "not a GROUP BY expression"

,我不知道爲什麼它是說?

沙发
0
3

你的錯誤是由你分組st.store而沒有選擇數據。您在SELECT或GROUP BY子句中所需的所有非聚合必須同時出現在兩者中。

話雖如此,你讓這太複雜了。如果我們從頭開始,你想從商店的東西:具有一定的SKU

select * from stores where store between 1 and 10 and sku = 10101 

select * from stores 

只有某些商店

select * from stores where store between 1 and 10 

現在需要的獨特的商店

select distinct store from stores where store between 1 and 10 and sku = 10101 

finally y OU希望獨特的商店

select count(distinct store) 
    from stores 
where store between 1 and 10 
    and sku = 10101 

它看起來像你從集,而不是邏輯層層建立查詢起來的計數。查詢是一組條件,只需要創建集合(內聯視圖等),如果您需要添加依賴於構造表達式的操作。構建查詢時,重點關注分層附加邏輯。如果由此產生的查詢看起來太複雜了,那麼你就可能會這麼說。


根據上表店名店其實我認爲這是對存儲唯一的(而且這是主鍵,因此非空),所以你不需要進行額外的排序使其具有唯一性

select count(*) 
    from stores 
where store between 1 and 10 
    and sku = 10101 
板凳
0
0

在SQL當你使用GROUP BY,那麼你必須要確定你不能使用*,僅一個字段與組的選擇字段。 是的,你可以使用*,那麼你必須聲明組中的所有字段。 此外,您還需要將所有具有聚合功能的字段,但無論哪個字段與分組依據都不允許使用聚合。

0
votes
answers
7 views
+10

在Oracle中將具有多列的多行轉換爲一個記錄

2

在Oracle SQL查詢中我們得到了40個記錄具有13列。我想合併所有這些記錄到一列意味着40 * 13 = 520列在1記錄。其EG-樣品表記錄數在Oracle中將具有多列的多行轉換爲一個記錄

col1 col2 city cntry conti 
1  abc NYC USA NA 
2  def LON UK  EU 
3  xyz DUB UAE ASIA 

再經過合併所有記錄&進入一個記錄,那麼它應該像下面的單

col1 col2 city cntry conti col1 col2 city cntry conti col1 col2 city cntry conti 
1  abc NYC USA NA  2  def LON UK  EU  3  xyz DUB UAE ASIA 
+0

Oracle對單個記錄中的字節數有限制。您的數據可能不適合放在一行上。 –

+0

@GordonLinoff你能提供一個對這個限制的參考嗎?我[可以找到](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/logical-database-limits.html#GUID-685230CF-63F5-4C5A-B8B0-037C566BDA76)只有每個表的列的限制。 –

+0

「行的固定長度列的最大累積長度(字節)= 32,768」,https://docs.oracle.com/cd/E11882_01/timesten.112/e21643/limit.htm#TTREF456。 –

沙发
0
2

如果列col1包含唯一值那麼你可以使用pivot

select * 
    from t 
    pivot (max(col1) col1, max(col2) col2, max(city) city, max(cntry), max(conti) conti 
     for col1 in (1, 2, 3)) 

SQLFiddle demo

+0

可以用1條記錄中的40 * 13 = 420列來做 – user8487380

+0

[是](http://sqlfiddle.com/#!4/83b2cd/247)。 –

+1

@PonderStibbons可以在Oracle 10g上執行,因爲在Oracle 10g中沒有任何受支持的WITH子句。沒有WITH子句可以合併? –

0
votes
answers
7 views
+10

如何從oracle中的其他兩個表中插入數據

0

我正在創建一個新表。表中的值/數據來自另一個表。例如:在table A我有場Code用2個數據,EXEIMP。在table B我有一個數據20162017Year。現在我需要製作table C,其中字段Status其中Status字段中的數據爲EXE-2016,IMP-2016,EXE-2017IMP-2017。這種問題的查詢過程如何?如何從oracle中的其他兩個表中插入數據

table A 
code | code_name | flag 
EXE | Execute | Y 
IMP | Implement| Y 

table B 
Year | phase | flag 
2016 | P1 | Y 
2016 | P2 | Y 
2017 | P1 | Y 
2017 | P2 | Y 
2018 | P1 | N 

table C 
Status | Flag 
EXE-2016 | Y 
IMP-2016 | Y 
EXE-2017 | Y 
IMP-2017 | Y 
EXE-2018 | N 
IMP-2018 | N 
+0

提示:'CREATE TABLE [TABLE_1]作爲選擇......' – zarruq

+0

不清楚你想要什麼。請包括所有表格的樣本表數據,包括輸出。 –

+0

我有一個查表編輯一樣,我需要做的表格C,在那裏他們得到表A和B.我試圖Concat的數據,但我沒有得到任何結果 –

沙发
0
0

你想要從兩個表中交叉加入記錄:

  • 表A每年的記錄來自表A
  • 每年來自表B的MAX標記(即, 'Y'勝過'N')

然後使用CREATE TABLE c AS <query>爲了從查詢結果創建表格C.

create table c as 
select a.code || '-' || bb.year as status, bb.flag 
from a 
cross join 
(
    select year, max(flag) as flag 
    from b 
    group by year 
) bb; 

(也許巴爾巴羅斯Özhan是正確的,你真的想創建一個視圖,而不是然後使用create view c as <query>。)

板凳
0
-1
create table C as 
select A.code || '-' || B.year as status 
from A, B 
+2

即使僅僅是一個交叉連接,也不應該使用冗餘的連接語法25年前。使用適當的ANSI連接:'從交叉連接B'。 –

+0

我想除了我的妻子之外,沒有人應該對我說我應該做什麼以及我應該做什麼。 –

地板
0
0

在你的情況下,最好以這樣的方式來創建一個view記錄sql供以後就像一個表的使用情況:

create view tableC as 
select code||' - '||year status, flag 
from (
     select a.code, b.year, b.flag from tableA a cross join tableB b  
    ) 
group by code, year, flag  
order by year, code;/ 

select * from tableC;/ 

D e m o

+1

不要在1 = 1上寫'inner join ...,因爲這不是內連接(兩個表的標準必須匹配),而是交叉連接。所以寫:'交叉連接tableB b'。 –

+0

@ThorstenKettner好的,你的想法更好,謝謝。 –

+0

在你的演示中你使用'insert into tableA values('EXE');',我需要的是他們從另一個表中自動生成。因爲我在表格A中有很多數據。你能舉出另一個例子嗎?你做了什麼看起來像我需要的東西 –

4楼
0
-1
CREATE table C as 
SELECT A.Code || '-' || B.Year AS 
STATUS , B.flag 
FROM A,B 
+2

請爲您的解決方案添加一些解釋。否則答案可能會被刪除。 – rghome

+0

是的,我該怎麼解釋? –

+0

以接受的答案爲例。 – rghome

0
votes
answers
7 views
+10

錯誤:PLS-00410:RECORD,TABLE或參數列表中的重複字段不允許

0

我遇到了存儲過程的麻煩。我不斷收到此錯誤: 錯誤:PL/SQL:編制單位分析終止 錯誤:PLS-00410:重複的記錄,表或參數列表字段不允許錯誤:PLS-00410:RECORD,TABLE或參數列表中的重複字段不允許

這就是我試圖運行:

create or replace procedure service_order_proc 
(
SERVICE_ORDER_ID NUMBER, 
CUST_ID NUMBER, 
EMP_ID NUMBER, 
SERVICE_DATE DATE, 
SERVICE_ORDER_STATUS_ID NUMBER, 
SERVICE_ORDER_TYPE_ID NUMBER, 
SERVICE_TOTAL NUMBER, 

EMP_ID NUMBER, 
FNAME VARCHAR2, 
LNAME VARCHAR2, 
PNUMBER VARCHAR2, 
EMP_STATUS_ID NUMBER, 
EMP_GROUP_ID NUMBER 

) 

AS BEGIN 

insert into service_order values (SERVICE_ORDER_ID, CUST_ID, EMP_ID, SERVICE_DATE, 
SERVICE_ORDER_STATUS_ID, SERVICE_ORDER_TYPE_ID, SERVICE_TOTAL); 

insert into employee values (EMP_ID, FNAME, LNAME, PNUMBER, 
EMP_STATUS_ID, EMP_GROUP_ID); 

end; 
沙发
0
1

你有EMP_ID列出兩次作爲過程的參數

0
votes
answers
7 views
+10

如何輸出多個實體?(oracle sql)

1

我有兩個表。模型和汽車。以及用戶輸入的名稱和價格(存儲在AUTOMOBILES中)導出所有模型的過程。如何輸出多個實體?(oracle sql)

create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE, 
             VAR_PRICE OUT AUTOMOBILES.A_PRICE%TYPE) 
             as 
             begin 
SELECT a.A_PRICE 
INTO VAR_PRICE 
FROM AUTOMOBILES a 
join MODELS m 
on a.MODELS_ID_MODEL=m.ID_MODEL 
where m.NAME_MODEL=VAR_MODEl; 
dbms_output.put_line(VAR_MODEL||'''s price is : '||VAR_PRICE); 
END; 

過程的開始:

var v_modelzz varchar2; 
exec modelzz('&model_name',:v_modelzz); 

的問題是我要導出的所有實體的某型號。他們的一個以上,一個模型可以有兩個或更多的記錄。我知道這是不實際的。這只是測試。這裏的錯誤:exact fetch returns more than requested number of rows

沙发
0
1

您應該創建甲骨文型(我沒有測試此代碼,只是一個例子):

create type v_price_array 
as table of AUTOMOBILES.A_PRICE%TYPE ; 

變化過程的返回類型:

create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE, 
             VAR_PRICES OUT v_price_array) 

Or return created array type from function instead of procedure. 

而變化您的選擇:

SELECT a.A_PRICE 
BULK COLLECT INTO VAR_PRICES 
FROM AUTOMOBILES a 
join MODELS m 
on a.MODELS_ID_MODEL=m.ID_MODEL 
where m.NAME_MODEL=VAR_MODEl; 
dbms_output.put_line(VAR_MODEL ||''s price is : '||VAR_PRICE); 

第二種方法是在OUT參數sys_refcursor中返回。然後你必須打開程序中的光標:

create or REPLACE procedure modelzz( VAR_MODEL IN MODELS.NAME_MODEL%TYPE, 
             VAR_PRICES OUT SYS_REFCURSOR) 
             as 
             begin 
OPEN VAR_PRICES FOR 
SELECT a.A_PRICE 
FROM AUTOMOBILES a 
join MODELS m 
on a.MODELS_ID_MODEL=m.ID_MODEL 
where m.NAME_MODEL=VAR_MODEl; 
dbms_output.put_line(VAR_MODEL ||''s price is : '||VAR_PRICE); 
END; 

我推薦第二種方法。

+1

@ruveena感謝您的編輯 –

+0

如果解決方案正常工作,請返回反饋 –

0
votes
answers
7 views
+10

SQL:在更新

0

我不能發現我的請求,問題誤差內加盟。這裏是我的要求和2臺:SQL:在更新

UPDATE RESERVATION inner join client on reservation.numcl = client.numcl 
SET reservation.numcl2 = client.numcl2; 

錯誤:

=> [42000][971] ORA-00971: missing SET keyword 
  1. 表客戶 Client table

  2. 預訂客戶 reservation table

解決辦法:

UPDATE RESERVATION SET reservation.numcl2 = (select client.NUMCL2 
              from CLIENT 
              where client.NUMCL= RESERVATION.numcl); 
+0

你是在第一行之後突出顯示第一行還是錯過了';'? – Hans

+0

我並沒有真正明白你的意思,突出顯示了第一行,但內部連接在選擇實例中工作得很好。而且;應該在最後的權利? – Rotciv

+0

我認爲它不允許你「更新」一個連接。它正在尋找表名後面的'SET'關鍵字,當它執行一個簡單的'UPDATE'時,它通常會出現...... –

沙发
0
0

Oracle不支持在updatejoin(至少明確地)。你想要做什麼的等效是:

UPDATE RESERVATION r 
    SET numcl2 = (select client.NUMCL2 
        from CLIENT c 
        where c.NUMCL = r.numcl 
       ) 
    WHERE EXISTS (SELECT 1 FROM client c WHERE c.NUMCL = r.numcl); 

exists是很重要的,如果你想處理在沒有比賽的案件。

+0

好吧,我明白了!但在我的情況下,他們不能在預留數量不在客戶端,所以我不需要把它放在正確的?在存在選擇之後,'1'的用法是什麼? – Rotciv

+0

@Rotciv。 。 。如果你不需要檢查比賽,那麼你不需要。我只是指出Oracle中等效的語法。 「選擇」後面的內容並不重要; 「1」很容易打字。 –

0
votes
answers
7 views
+10

如何預先填充APEX中的表格文件

0

我正在使用apex創建具有數據庫後端的應用程序。 該應用程序允許用戶根據特定標準搜索機構,一旦指定標準,向用戶顯示報告,包括機構名稱和機構標識。名稱列鏈接到顯示所選機構詳細信息的頁面。如何預先填充APEX中的表格文件

我想從詳細信息頁面創建一個鏈接,將用戶帶到'聯繫我們'頁面,該頁面應該包含一些預填充的表單字段,例如機構名稱和電子郵件等。但是,我不確定如何通過機構編號,以便可以預填字段。

+0

通過鏈接到一個頁面項目上通過鏈接與我們聯繫頁面傳遞機構ID。 – RLOG

+0

可以你給我舉例說明如何做到這一點? –

沙发
0
0

在您的報告中,請將機構標識作爲名稱和徽標旁邊的link類型的列。使target page您與我們聯繫頁面,並與#INSTITUTION_ID#填充機構ID頁面項目(或任何你institution_id列稱爲。

0
votes
answers
6 views
+10

PL/SQL:如何將行組合成一個字符串

1

在Oracle Database 12c上使用PL/SQL。PL/SQL:如何將行組合成一個字符串

我有這樣的一個表:

filename | priority       
---------- ----------- 
foo | 1   
bar | 2 
baz | 3  

我要創建這個字符串:FOO,1條,2,巴茲,3

什麼是做到這一點的最好方法是什麼?以前我用SQL Server和這工作:

DECLARE 
    @str varchar(100) 
SELECT @str = COALESCE(@str + ', ', '') + CONCAT(filename, ', ', priority) 
FROM table_name; 

但我想現在要做到這一點在Oracle中,我無法得到它的工作。我已經嘗試了一些方法,如:

DECLARE 
    str varchar(100) := coalesce(str || ', ', '') || CONCAT(filename, ', ', priority) 
FROM table_name; 

但我得到了這個錯誤,:「期待的下列之一,當‘

我也試着像LISTAGG’PLS-00103出現符號」 FROM :

listagg(filename|| ',' || priority, ',') within group (order by priority) as str 
from table_name; 

這給我的錯誤,「PLS-00103:出現符號‘在’在需要下列之一時」

我在做什麼錯?

+0

'DECLARE ... FROM TABLE_NAME' ??? –

+0

爲什麼你需要一個過程(和PL/SQL)代碼?你可以用普通的SQL來做到這一點。那麼 - 爲什麼你需要這樣做?可能有(很多)更好的方法來做你需要的東西;如果你能解釋爲什麼你需要它,我們可能會提供幫助。 – mathguy

+0

我正在修改用PL/SQL編寫的現有代碼以包含新功能。 – Murasaki

沙发
0
2

Oracle中的存儲過程由聲明部分和執行部分組成。您可以使用DECLARE部分來聲明變量,程序使用BEGINEND。使用SELECT INTO爲您的變量選擇一個值。

DECLARE 
    v_str varchar(10000); 
BEGIN 
    select 
    listagg(filename || ',' || priority, ',') within group (order by priority) 
    into v_str 
    from table_name; 

    ... 
END; 
+0

謝謝!我沒有意識到這個聲明不能和執行代碼在同一個塊中。 – Murasaki