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 Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 63

0
votes
answers
24 views
+10

distinct或group by by

0

我有一個查詢來檢索oracle數據庫中某些表的數據。distinct或group by by

我最後需要的是獲取所有不重複的數據,爲此我需要所有沒有相同FOLIO,TARJETA,CUENTA和IMPORTE的記錄。 所以,爲此,我嘗試使用Distinct和Group,但我不知道腳本中應該使用哪個/如何使用它,以及它可能在哪裏更有效。

我試圖將GROUP BY與ORDER BY前面的值放在一起,但它表示「不是GROUP BY表達式」。我不想修改查詢,只需刪除重複的參數(FOLIO,TARJETA,CUENTA和IMPORTE)。

SELECT FOLIO_EXP, 
     FOLIO, 
     DOC, 
     REFERENCIA, 
     TARJETA, 
     CUENTA, 
     NOMBRE, 
     IMPORTE, 
     IMP_REC, 
     IMP_REPRE, 
     IMP_QUEB, 
     FECHA_PAGO, 
     MCC, 
     COMERCIO, 
     PCC, 
     FECHA_COM, 
     ADQUIRENTE, 
     ESTADO, 
     "TIPO DE FRAUDE", 
     F_FRAUDE, 
     F_RECLAMO, 
     F_REEMBOLSO, 
     DICAMINO 
FROM 
    (SELECT E.FOLIO_EXP, 
      A.FOLIO, 
      'D' AS DOC, 
      A.REFERENCIA, 
      A.TARJETA, 
      A.ACCT_NUM AS CUENTA, 
      B.NOMBRE_TH AS NOMBRE, 
      TO_CHAR(A.MONTO,'999,999.99') IMPORTE, 
      D.IMP_REC, 
      F.IMP_REPRE, 
      DECODE((A.MONTO -D.IMP_REC),NULL,A.MONTO,(A.MONTO -D.IMP_REC)) AS IMP_QUEB, 
      D.FECHA_PAGO, 
      A.SIC_CDE AS MCC, 
      A.COMERCIO, 
      C.PCC, 
      C.FECHA_COM, 
      C.ADQUIRENTE, 
      C.ESTADO, 
      'INTERNET' AS "TIPO DE FRAUDE", 
      A.FECHA_TRANS AS F_FRAUDE, 
      A.FECHA_RECLAMO AS F_RECLAMO, 
      A.FECHA_BONIFICACION AS F_REEMBOLSO, 
      A.USUARIO AS DICAMINO 
    FROM OPPF.T00EMISOR A 

    LEFT JOIN 
    (SELECT A.FECHA, 
      A.TARJETA, 
      C.PCC, 
      C.FECHA_COM, 
      C.ADQUIRENTE, 
      C.ESTADO 
     FROM 
     (SELECT TARJETA, 
       MAX(FECHA_INFO) FECHA 
     FROM OPPF.T00_PCC 
     GROUP BY TARJETA) A 
     LEFT JOIN 
     (SELECT FECHA_INFO, 
       TARJETA, 
       PCC, 
       FECHA_COM, 
       ADQUIRENTE, 
       ESTADO 
     FROM OPPF.T00_PCC)C ON(A.TARJETA = C.TARJETA 
           AND A.FECHA = C.FECHA_INFO)) C ON(TO_CHAR(C.TARJETA) = TO_CHAR(A.TARJETA)) 

    LEFT JOIN 
    (SELECT MAX(SE_REVISO) SE_REVISO, 
      NOMBRE_TH, 
      TARJETA 
     FROM OPPF.T00CASOSRESUELTOS 
     GROUP BY TARJETA, 
       NOMBRE_TH) B ON(SUBSTR(A.TARJETA,1,16) = SUBSTR(B.TARJETA,1,16) 
           AND A.FECHA_BONIFICACION = B.SE_REVISO) 
    LEFT JOIN 
    (SELECT MAX(FECHA_PAGO) FECHA_PAGO, 
      TARJETA, 
      REFERENCIA, 
      COUNT(REFERENCIA) N, 
      SUM(MONTO_LIQ) AS IMP_REC--, FECHA_TRXS 

     FROM OPPF.T00_CC_RECUP 
     GROUP BY TARJETA, 
       REFERENCIA, 
       FECHA_TRXS) D ON(TO_CHAR(D.TARJETA) = TO_CHAR(A.TARJETA) 
           AND D.REFERENCIA = A.REFERENCIA) 
    LEFT JOIN 
    (SELECT TARJETA, 
      COUNT(TARJETA) TRANS, 
      COUNT(REFERENCIA) NR, 
      REFERENCIA, 
      SUM(IMPORTE) IMP_REPRE 
     FROM OPPF.T00_REPRESENTACIONES 
     GROUP BY TARJETA, 
       REFERENCIA) F ON(A.TARJETA = F.TARJETA 
           AND LPAD(TO_CHAR(A.REFERENCIA),23,'0') = LPAD(TO_CHAR(F.REFERENCIA),23,'0')) 
    LEFT JOIN 
    (SELECT MIN(FOLIO) FOLIO_EXP, 
      TARJETA, 
      FECHA_BONIFICACION 
     FROM OPPF.T00EMISOR --WHERE FECHA_BONIFICACION BETWEEN '02/09/2015' AND '31/12/2015' 

     GROUP BY FECHA_BONIFICACION, 
       TARJETA 
     ORDER BY FECHA_BONIFICACION, 
       TARJETA, 
       FOLIO_EXP) E ON(E.TARJETA = A.TARJETA 
           AND E.FECHA_BONIFICACION = A.FECHA_BONIFICACION) 
    WHERE A.ENTRY_MODE IN (' ', 
          '1', 
          '01', 
          '001', 
          '0', 
          '00', 
          '012', 
          '010', 
          '12', 
          '10', 
          '11', 
          '011')) 
WHERE F_REEMBOLSO = '04/07/2017' 

ORDER BY FOLIO, 
     REFERENCIA 
+2

我相信你會得到解釋'DISTINCT'給你的答案。我只想評論一下,在大多數SQL查詢中,真正重複的記錄是設計不佳的數據模型和/或寫得不好的查詢的標誌。可能9次出10次,當我在初學者的代碼中看到「DISTINCT」關鍵字時,它是一個能夠掩蓋真正問題的創可貼。您可能想問自己:爲什麼我會首先獲取重複記錄? –

+0

是的,它的設計不好,客戶端軟件使用不好,都會影響數據 – arnoldssss

+1

鑑於查詢的可怕程度,@MatthewMcPeak是正確的:由於您的查詢定義不明確,您獲取「重複」記錄連接和過濾器。很顯然[你之前關於連接複雜性的問題](https://stackoverflow.com/q/47984589/146325)表明你知道這一點。但是,除非你能解釋產生這個怪物的業務邏輯,否則我們不能幫你重寫它。 – APC

沙发
0
1

你的情況,你不希望得到重複的結果,從而去你最好的選擇是DISTINCT。

DISTINCT和GROUP BY至少有由(Oracle風格)沒有什麼區別:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212

Normaly GROUP BY用於像MAX,MIN和其他聚合函數。不同的是隻刪除重複。

SQL服務器檢測您是否沒有聚合函數,並生成執行計劃,就好像您只是使用「Distinct」一樣。所以真的沒什麼大不同。

所以用DISTINCT你在這裏用正確的概念。 希望這有助於。

+0

好的,你知道我可以在哪裏放置不同的東西,讓它起作用嗎? – arnoldssss

0
votes
answers
18 views
+10

映射NCLOB在Hibernate中

0

我在Oracle表已經兩個列:映射NCLOB在Hibernate中

  • firstColumn NVARCHAR2
  • secondColumn NCLOB

映射在類:

@Column(length = 1000, columnDefinition = "nvarchar2 (1000)") 
@Nationalized 
private String firstColumn; 

@Lob 
@Nationalized 
private String secondColumn; 

Additionaly財產休眠.use_nationalized_character_data設置爲true。

更新firstColumn對於中文字符正常工作,但數據庫中的secondColumn包含類似於倒置問號的內容。

我嘗試了許多組合設置註釋:

@Lob 
@Nationalized 
@Type(type="org.hibernate.type.NClobType") 
@Type(type="org.hibernate.type.MaterializedNClobType") 

但沒有成功。

  • 數據庫:Oracle數據庫10g企業版
  • 司機:ojdbc7
  • 休眠:5.2.1
沙发
0
0

我已經解決了我的映射問題。解決方案(解決方法?)是:

@Column(columnDefinition = "nclob", length=100000) 
@Nationalized 
private String secondColumn; 
0
votes
answers
27 views
+10

函數調用中的DML

0

我有一箇舊的客戶端軟件,它有一個連接的oracle數據庫用於持久化。作爲接口,客戶端軟件只允許調用函數和過程。我幾乎可以完全訪問數據庫,即我可以定義函數和過程。由於接口,只有函數可以返回值,我不能使用過程的參數選項OUT函數調用中的DML

現在我只是想讀從表中的值:

SELECT value FROM myTable WHERE id = 42; 

,又重新增加值:

UPDATE myTable SET value = value + 1 WHERE id = 42; 

我可以用一個函數的SELECT語句,併爲一個程序更新並連續呼叫。這裏的問題是客戶端不存在交易。因此,在select和update之間另一個線程可能會得到錯誤的值。

所以我的問題是,我該如何使用在交易雙方通話,而無需使用交易...

嘗試的途徑:

  • 使用匿名PL/SQL塊 - >語法不受客戶支持。
  • 將兩個調用放在一個函數中 - >在select語句中不允許DML。
  • PRAGMA AUTONOMOUS_TRANSACTION - >我聽說這是一件壞事,不應該使用。
+2

'Functions'旨在*** ***不是有副作用。如果你想要改變數據庫的狀態,那麼你需要使用'Procedure'。 – MatBailie

+1

如果你想要一個簡單的'計數器',並且在這種情況下沒有其他事情發生,你可以考慮'CREATE SEQUENCE'? – MatBailie

+0

如果我使用過程(並且不能使用'OUT'),我需要兩個不是線程保存的數據庫調用 – Thanthla

沙发
0
1

可以做DML,如下面所示的函數裏面,但我要強調 - 採取的其他意見留意。看看使用一個序列(甚至是多個序列),因爲在函數內部做DML通常是一個壞主意,因爲函數調用的執行次數(如果從SQL調用的話)不是確定性的。另外,如果大量使用,還有可擴展性問題。並且在多用戶環境中,您需要處理鎖定/序列化,否則您將需要多個會話才能返回相同的整數值。

所以......在這一切之後,你仍然頭這條道路:-(

SQL> create table t (x int); 

Table created. 

SQL> insert into t values (0); 

1 row created. 

SQL> 
SQL> create or replace 
    2 function f return int is 
    3 pragma autonomous_transaction; 
    4 retval int; 
    5 begin 
    6 update t 
    7 set x = x + 1 
    8 returning x into retval; 
    9 commit; 
10 return retval; 
11 end; 
12/

Function created. 

SQL> 
SQL> select f from dual; 

     F 
---------- 
     1 

1 row selected. 

SQL> select * from t; 

     X 
---------- 
     1 

1 row selected. 

SQL> select f from dual; 

     F 
---------- 
     2 

1 row selected. 

SQL> select * from t; 

     X 
---------- 
     2 

1 row selected. 

SQL> select f from dual; 

     F 
---------- 
     3 

1 row selected. 

SQL> select * from t; 

     X 
---------- 
     3 

1 row selected. 
+0

謝謝你的回答。我知道你提出的解決方案,以及它的問題。因此,我很可能會降低一致性並執行閱讀和更新程序的功能。執行此工作流程的兩個線程交錯的機會非常低,我可能會冒這個風險。 – Thanthla

0
votes
answers
20 views
+10

如何取一個字符串,將小數內的小數轉換爲分數,提取部分字符串,並將其與表格進行比較?

1

這是我需要分析的數據:如何取一個字符串,將小數內的小數轉換爲分數,提取部分字符串,並將其與表格進行比較?

--TABLE: PRICE_LIST 


ITEM_DESCRIPTION VARCHAR2(60) VENDOR_PARTNO VARCHAR2(15) 
---------------------------- -------------------------- 
.374 x 3 w/ph KLT-6   5506125 
.4375 x 3-1/2 w/ph KLT-3345 5506124 
.125 x 2-1/2 w/ph KLT-3211  5506123 
.3125 x 4-1/2 w/ph KUR-44  5506127 

這是我需要PRICE_LIST.ITEM_DESCRIPTION比較表:

--Table: MATERIALS 
--COLUMN: VARCHAR2(20) 

ITEM_ID 
-------------- 
1/2 X 3-1/2 
5/16 X 4-1/2 
1/8 X 2-1/2 

我試過這種方法,試圖將它們分開,但是這樣會需要大量的工作:

SELECT SUBSTR(VALUE, 1, INSTR(VALUE, 'x')-1) DIAMETER, 
     SUBSTR(VALUE, INSTR(VALUE, 'x')+1) DIRTY_LENGTH 
     FROM (SELECT DESCRIPTION VALUE FROM PRICE_LIST); 

DIAMETER DIRTY_LENGTH 
-------- ------------ 
.374  3 w/ph KLT-6 
.4375  3-1/2 w/ph KLT-3345 
.125  2-1/2 w/ph KLT-3211 
.3125  4-1/2 w/ph KUR-44 

但現在我有與我不知道該怎麼做小數列,並有我的第二個分數的另一列,但其他數據我不需要。

因爲只有在PRICE_LIST表中的最後2個值將匹配,我要的是隻此返回:

ITEM_DESCRIPTION VENDOR_PARTNO 
---------------- ------------- 
1/8 X 2-1/2  5506123 
5/16 X 4-1/2  5506127 

感謝您的幫助!

+0

你爲什麼要使用這樣的設計很差的數據?你應該有一個主鍵,你可以用來匹配,而不是彌補格式錯誤的數據和草率的字符串解析和比較。您可能想要購買一本書或找到關於基本數據庫設計原則的Web教程。 –

+0

似乎第一部分的描述可能對應於直徑(.125 == 1/4等)。而且,是的,數據應該是結構化的。目前很難理解和使用。 – igr

+1

@KenWhite - 我不知道OP的具體情況。但是,您是否可以想象這種情況,即現有數據,在一個認識到他們以前的IT人員是多麼愚蠢的組織中(只是看看數據模型),他們解僱了所有不熟練的人員,而是*僱傭OP和其他人處理混亂?當然,修復數據模型等等,你會怎麼做?你不需要做**正確** OP的要求是什麼?如果你需要幫助,你不會在這裏問嗎? – mathguy

沙发
0
1

數據格式很糟糕。看來你需要創建一個自定義用戶definied PL/SQL函數來計算這些表達式:

CREATE OR REPLACE FUNCTION evaluate_me(p_x VARCHAR2) 
RETURN NUMBER 
DETERMINISTIC 
IS 
    x VARCHAR2(200); 
    expr VARCHAR2(100); 
    y NUMBER; 
BEGIN 
    x := lower(substr(p_x, 1, regexp_instr(p_x ||'q', '[^.0-9 xX/-]+')-1)); 
    expr := replace('BEGIN :p:='|| x ||'; END;', 'x', '*'); 
    execute immediate expr USING OUT y; 
    RETURN y; 
END; 
/

,然後做就像這個例子:http://sqlfiddle.com/#!4/c7681/2

select p.*, evaluate_me(item_description) x 
from PRICE_LIST p; 

|   ITEM_DESCRIPTION | VENDOR_PARTNO |  X | 
|-----------------------------|---------------|--------| 
|   .374 x 3 w/ph KLT-6 |  5506125 | 1.122 | 
| .4375 x 3-1/2 w/ph KLT-3345 |  5506124 | 0.8125 | 
| .125 x 2-1/2 w/ph KLT-3211 |  5506123 | -0.25 | 
| .3125 x 4-1/2 w/ph KUR-44 |  5506127 | 0.75 | 

select m.*, evaluate_me(item_id) x 
from MATERIALS m 
; 
|  ITEM_ID |  X | 
|--------------|-------| 
| 1/2 X 3-1/2 |  1 | 
| 5/16 X 4-1/2 | 0.75 | 
| 1/8 X 2-1/2 | -0.25 | 

SELECT * 
FROM PRICE_LIST p 
JOIN MATERIALS m 
ON evaluate_me(p.item_description) = evaluate_me(m.item_id) 
; 

|   ITEM_DESCRIPTION | VENDOR_PARTNO |  ITEM_ID | 
|----------------------------|---------------|--------------| 
| .125 x 2-1/2 w/ph KLT-3211 |  5506123 | 1/8 X 2-1/2 | 
| .3125 x 4-1/2 w/ph KUR-44 |  5506127 | 5/16 X 4-1/2 | 

這預計會極其緩慢,th將爲左表的每一行調用e函數,然後調用右表的每一行。因此,如果左邊的表格有10,000行,右邊的表格有20000行(對RDBMS系統來說沒有那麼多),那麼該函數將被稱爲10,000 + 10,000 * 20,000 = 200,010,000次。
這是一個糟糕的設計成本 - 數據不遵循First Normal Form的規則,必須在每次訪問時解析。

爲了使查詢速度更快,你必須創建兩個功能指標,否則當你啓動這個查詢,你可以參加每月休假:

CREATE INDEX MATERIALS_eval ON MATERIALS(evaluate_me(ITEM_ID)); 

CREATE INDEX PRICE_LIST_eval ON PRICE_LIST(evaluate_me(ITEM_DESCRIPTION)); 
+0

感謝您花時間發佈此信息。我明天會在辦公室回來測試一下,然後回來。我同意這些數據是一團糟。它設計得很差,並且這種方式維持了15年。 – Delbudge

0
votes
answers
28 views
+10

在oracle表中選擇行所有者

0

我有一個名爲Table1的表,並且我有五個具有SELECT和INSERT權限的用戶,這些用戶中的每一個都將數據填充到表中。 如何顯示每一行是所有者?例如由user2插入的第1行,由user4插入的第2行等等?在oracle表中選擇行所有者

沙发
0
0

找出哪個用戶添加了現有行已經太晚了。要知道未來插入的行,該列添加到表:

alter table table1 add created_by varchar2(30) default user; 

另一種常用添加的列是:

alter table table1 add created_date date default sysdate; 
+0

請問這種填充誰插入記錄或誰創建該表的用戶的用戶? –

+0

@KaushikNayak誰插入了行 –

+0

謝謝..不知道爲什麼我困惑了一會兒。 –

71
votes
answers
26 views
+10

Where does Oracle ADF 11g stands among Java EE Frameworks?

This is a two part question:

I would like to know where does Oracle ADF 11g stand as a framework to develop / deploy Web / Java EE Applications as compared to other frameworks. How much is Oracle ADF being used as a framework to Develop Web Applications. I am asking from a perspective that whether or not there are good job opportunities as an Oracle ADF Developer and what the future looks like for those holding Oracle ADF skills.

Also as Oracle plans to use ADF as core technology for Fusion Applications, Is it good time to build Oracle ADF skills as a siebel developer? As the future Oracle CRM Applications like ERP, SCM will be based on ADF should developers start building ADF skills. Around when will customers start implementing those applications based on ADF. Will these be available On Premise or mostly On Demand in SaaS way.

up vote 53 down vote accepted favorite
沙发
+530
+50

我們已在公司選擇Oracle ADF用於其中一個項目。可悲的是,這被證明是一個很大的錯誤。我個人使用過Oracle產品,特別是他們的數據庫,但就融合中間件而言,我建議你遠離它。ADF是迄今為止我作為建築師使用過的最糟糕的框架。我注意到的一些功能是:非常複雜,Oracle只是“發明”或強制一些開發方法,這些方法多年前已被Java社區證明是一種不好的做法。與其他框架相比,ADF非常慢。由於速度慢,我的意思是ADF頁面運行緩慢。原因是生成的html和javascript非常複雜。您可以通過打開Firebug並檢查生成的HTML來檢查這一點......它看起來像90年代的東西......太糟糕了。不要過於迂腐,但ADF頁面有大量的驗證錯誤,導致它們在所有瀏覽器上運行時出現問題。在我看來,ADF的架構很混亂。例如Struts2是一個更清晰的框架,它使得它很容易與第三方庫如jQuery等集成.Oracle提倡ADF作為MVC框架但坦率地說我沒有看到那裡的實際MVC架構。ADF使用自己的javascript庫,這些庫是巨大的,與jQuery或Prototype等其他版本相比,幾乎不可能修改,未優化和緩慢。J2EE中出現的趨勢是輕量級可插拔框架,可以輕鬆地與其他工具集成,例如用於管理依賴項的Spring,用於腳本的jQuery,用於持續集成的CC。ADF是一個與其他ORacle工具緊密集成的重量級框架,這使得它很難以任何其他方式使用它。比如Oracle設計的。

更不用說在開發ADF時你不得不使用的開發工具 - JDeveloper非常錯誤並且經常崩潰。在Eclipse中開發是有問題的,因為ADF有許多“特定”文件,JDeveloper會自動生成這些文件。

總而言之...... ADF對我們來說是一個巨大的失望。我們花了好幾個月搞亂它,最後我們的客戶決定應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。 p>更不用說開發ADF時不得不使用的開發工具 - JDeveloper非常錯誤並且經常崩潰。在Eclipse中開發是有問題的,因為ADF有許多“特定”文件,JDeveloper會自動生成這些文件。

總而言之...... ADF對我們來說是一個巨大的失望。我們花了好幾個月搞亂它,最後我們的客戶決定應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。 p>更不用說開發ADF時不得不使用的開發工具 - JDeveloper非常錯誤並且經常崩潰。在Eclipse中開發是有問題的,因為ADF有許多“特定”文件,JDeveloper會自動生成這些文件。

總而言之...... ADF對我們來說是一個巨大的失望。我們花了好幾個月搞亂它,最後我們的客戶決定應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。 在Eclipse中開發是有問題的,因為ADF有許多“特定”文件,JDeveloper會自動生成這些文件。

總而言之...... ADF對我們來說是一個巨大的失望。我們花了好幾個月搞亂它,最後我們的客戶決定應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。 在Eclipse中開發是有問題的,因為ADF有許多“特定”文件,JDeveloper會自動生成這些文件。

總而言之...... ADF對我們來說是一個巨大的失望。我們花了好幾個月搞亂它,最後我們的客戶決定應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。 最後我們的客戶認為應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。 最後我們的客戶認為應用程序太慢而且難以支持它並完全取消它。

根據我的經驗,我只能說遠離它。選擇一個更受支持和架構清晰的解決方案,如Struts2或Spring。

非常感謝您分享您的經驗。 - Walker 2011年2月2日5:29

我有同樣的經歷--Luxspes 12年12月10日4:30

我不同意。我已經在Oracle ADF工作了16個月了。這是一個相當笨拙的學習者曲線,但過了一段時間,快速發展開始了。我沒有看到任何其他框架做所有這些事情,Oracle ADF管理。Shure,它有缺陷,速度慢,JDeveloper並不是最好的 - 但DAMN可以快速交換一些實體對象,創建一個新的主細節,並為您的應用程序添加有價值的數據。 - hogni89年3月1日在11:05

我完全同意。我現在被迫在Oracle ADF中開發 - 考慮改變工作因為它。這是最糟糕的。 - Celebes 2014年7月3日14:19

如果你需要幫助,只想添加,你就是一個人。OTN上的答案大多數情況下是錯誤的或沒有幫助,因為只有2或3個人真正了解ADF的工作原理。此外,構建業務服務所需的時間將在構建開發中最長的UI時丟失。遠離 !!! - 悉尼2014年8月4日17:33

+70

我已經將JDeveloper 10和11與ADF一起用於兩個企業ADF項目,這是一個著名的國防承包商。我同意ADF很複雜,但不同意JDev經常崩潰,或者頁面渲染速度很慢。

現在......為什麼選擇ADF?閱讀下面的Oracle概要,說明JDeveloper和ADF使“業務”程序員更容易訪問Java EE開發。雖然這並不能保證優雅的程序,但幾乎可以肯定的是,當這些開發人員遇到ADF問題時,他們可能會完全丟失並且幾乎不知道如何打開引擎蓋並進入內部。相反,即使嘗試整合當前的J2EE開源聚寶盆,它們也會丟失。


THE SERMON來源:現有的Java框架,如Struts,Spring,JSF,EJB,GWT等,都是覆蓋複雜區域的毯子,這些區域暴露出更簡單的控件。使用框架,開發人員不再使用Java核心API,而是與框架公開的接口和服務進行交互。

Blah,blah,blah ......

對於經驗豐富的Java開發人員而言,這似乎是一個小問題,對於剛接觸java和EE開發的業務開發人員來說是另一個障礙。這種類型的開發人員可能會轉向單一開發環境,承諾將app開發的所有方面集成到單一技術中。來自4GL桌面開發背景的開發人員可能會被PLSQL,.NET,Adobe Flash所吸引。

經驗豐富的Java開發人員可能會認為這是一個很大的錯誤,但是那些開發者會怎麼知道,除非Java也為他們提供單一的解決方案?該解決方案是一個端到端的框架,它為技術提供了另一種覆蓋,將不同的框架和技術結合到一個產品中,展示了視覺和聲明性開發手勢,因為它是主要的編程方法...... ADF。“

我對ADF一無所知(好的或壞的),但開發人員作為業務開發人員的觀點以及JEE作為平台的增長表明開發人員的知識正在逐漸減少的事實是非常正確的。謝謝你的回答! - 評論時間為2015年7月14日17:15

+30

自從過去6個月以來,我一直在使用ADF,我意識到ADF是一個特別大的應用程序,具有強大的數據庫集成。我還沒有看到任何其他框架可以為您提供如此快速和簡單的數據庫豐富的應用程序開發。

是的我同意它有一些錯誤,但如果你知道如何工作仍然很好用它。

問題與你的答案不同 - Jayram於2013年6月25日9:12

對於小型應用程序,您可以使用其他框架,但是當涉及到ERP等大型應用程序時,ADF是最好的。 - Amaan Junaid 2013年6月25日11:08

+30

我對ADF的看法和經驗是,它是一個非常可靠和強大的框架(不幸的是,開發工具不是。)我不確定它是否存在太大的競爭,至少不是來自單個框架。ADF本身實際上是幾個不同的框架,這些框架多年來組合成一個最具凝聚力的產品。既然Oracle擁有Java,我真的希望(希望)部分/大部分ADF能夠進入Java EE,因此我們可以看到替代實現和更好的開發工具。如果發生這種情況,它將很好地鞏固ADF的未來(只要Oracle在此期間不會破壞Java社區並將其推向其他VM平台)。

如果您已經熟悉使用或想要使用Oracle(相關)產品,ADF就是您想要的。鑑於甲骨文的市場滲透率,它可能是一個合理的賭注,它們將保持主導地位,並且您的技能將在未來幾年保持市場化。甲骨文花費了大量資金並收購了許多公司,試圖擁有和保留企業。

對我來說,SaaS問題有點難以回答。雖然它看起來確實朝這個方向發展,但我不清楚它是否主要是市場營銷試圖推動這種推動,或者是否需要商業需求。還有很多我沒有真正追踪過的問題,比如雲對於關鍵數據和可靠性的商業信任。 甲骨文花費了大量資金並收購了許多公司,試圖擁有和保留企業。

對我來說,SaaS問題有點難以回答。雖然它看起來確實朝這個方向發展,但我不清楚它是否主要是市場營銷試圖推動這種推動,或者是否需要商業需求。還有很多我沒有真正追踪過的問題,比如雲對於關鍵數據和可靠性的商業信任。 甲骨文花費了大量資金並收購了許多公司,試圖擁有和保留企業。

對我來說,SaaS問題有點難以回答。雖然它看起來確實朝這個方向發展,但我不清楚它是否主要是市場營銷試圖推動這種推動,或者是否需要商業需求。還有很多我沒有真正追踪過的問題,比如雲對於關鍵數據和可靠性的商業信任。

非常感謝您分享您的經驗。 - Walker 2011年2月2日5:42

@vdest(我沒有代表對該帖子發表評論),我同情你關於開發工具的問題,但看來你的投訴主要集中在ADF的UI方面。但ADF不僅包括構建UI / ADFFaces。但它足夠靈活,可以混合搭配許多其他標準技術和基於標準的技術。我懷疑你的問題部分與缺乏培訓有關,而且主要是對工具而不是框架本身感到沮喪。也就是說,您的感知並不罕見,並且是ADF的主要障礙。 - nix 2011年3月30日11:58

+30

簡短回答:

  • 您正在開發Enterpise解決方案,您的產品供應商是Oracle - ADF是最佳選擇
  • 您是獨立開發者,你的解決方案不適用於企業,你不會在Oracle堆棧中使用其他產品 - ADF不適合你,尋找另一個框架。

    長答案:

    如果您要使用Enterprise,那麼您的通用產品的堆棧供應商是Oracle。您最好的選擇是與ADF一起。每個主要版本的ADF都會變得更好。我從11.1.1.2開始使用ADF,查看10.x並使用12.1.3,同時仍然支持11.1.1.6上的大型企業應用程序。

    我看到了一個巨大的進步,很難找到另一種產品,可以為整個Oracle堆棧提供更好的集成和支持。

    但是,如果您非常熟悉其他框架或/並且不會使用其他Oracle產品和/或您的客戶無法為ADF / Weblogic / DB / ECM等支付相當多的費用。 - 您最好的選擇是避免ADF。它適用於大型企業解決方案。

    是的,事實上你實際上可以開發使用免費和限製版本的ADF - Essentials,使用其他應用服務器作為tomcat或glassfish,但你會更好地使用其他框架。ADF Essentials只是大型企業界的開端,而不是小型輕量級應用程序的解決方案。 如果您非常熟悉其他框架或/並且不會使用其他Oracle產品和/或您的客戶無法承擔為ADF / Weblogic / DB / ECM等付出相當多的費用.. - 您最好的選擇是避免ADF 。它適用於大型企業解決方案。

    是的,事實上你實際上可以開發使用免費和限製版本的ADF - Essentials,使用其他應用服務器作為tomcat或glassfish,但你會更好地使用其他框架。ADF Essentials只是大型企業界的開端,而不是小型輕量級應用程序的解決方案。 如果您非常熟悉其他框架或/並且不會使用其他Oracle產品和/或您的客戶無法承擔為ADF / Weblogic / DB / ECM等付出相當多的費用.. - 您最好的選擇是避免ADF 。它適用於大型企業解決方案。

    是的,事實上你實際上可以開發使用免費和限製版本的ADF - Essentials,使用其他應用服務器作為tomcat或glassfish,但你會更好地使用其他框架。ADF Essentials只是大型企業界的開端,而不是小型輕量級應用程序的解決方案。 是的,實際上你實際上可以開發使用免費和有限版本的ADF - Essentials,使用其他應用服務器作為tomcat或glassfish,但你會更好地使用其他框架。ADF Essentials只是大型企業界的開端,而不是小型輕量級應用程序的解決方案。 是的,實際上你實際上可以開發使用免費和有限版本的ADF - Essentials,使用其他應用服務器作為tomcat或glassfish,但你會更好地使用其他框架。ADF Essentials只是大型企業界的開端,而不是小型輕量級應用程序的解決方案。

從我的exp我發現11.1.1.6是較少的bugy,但如果你的自動工具(ADF)有錯誤我寧願去手動所以我沒有意外xD - Dunken 2016年10月20日在13:43

+20

ADF的發展是一種痛苦。對於新手來說,學習曲線太陡了。我希望它可能更像是學習dot NET。

從我的角度來看,在.NET中學習和構建功能需要花費四分之一的時間在ADF中做同樣的事情。當然,它的不平衡會隨著人們的學習而減少,但這幾乎是初學者的情景。這令人沮喪。

如果您認為ADF有一個陡峭的學習曲線,您應該嘗試使用Hibernate的EJB3! - APC 2013年6月26日16:20

0

自從過去3個月以來,我一直在使用ADF,我可以告訴您,ADF非常適合於為具有強大數據庫集成的大型企業應用程序提供快速開發過程所必需的情況。

與Spring之類的其他JavaEE框架相比,

  • 由於ADF的架構和缺乏與Spring相關的開發社區,修復bug非常複雜。Spring在框架周圍有很大的開發社區。

  • 使用ADF組件間集成很難實現MVC架構。

  • 與ADF開發人員相比,Spring開發人員擁有更多的聲譽和需求。

  • ADF非常慢,與Spring相比,重量級,緊密耦合,以及與Oracle工具集成的框架。

    希望這有助於您解決問題並獲得知識。快樂編碼!!!

0
votes
answers
15 views
+10

如何在oracle中添加一個字符串

0

我有像varchar這樣的值'M000000000009',我期待這個值的結果增加1,'M000000000010'。 我該怎麼做?如何在oracle中添加一個字符串

select 'M000000000009'+ 1 from dual 
+2

最簡單的方法是修復你的表模式,所以你有*前綴*列和*數字*列。另外,您需要修正以正確的方式將您的frankenvalue輸出爲*格式*這兩個值的查詢。 – Bohemian

沙发
0
3

你可以試試這個選擇:

SELECT SUBSTR('M000000000009', 1, 1) || LPAD((TO_NUMBER(SUBSTR('M000000000009',2)) + 1), 12, '0') NEW_SERIAL 
FROM DUAL 
板凳
0
0

蠻力,而不是漂亮的

select 
     substr(str,1,1) || substr(concat('0000000000000' , cast(substr(str,2,13) as int) + 1),-12) x 
    from (
    select 
     'M000000000009' as str 
    from dual 
    ) 

注:會失敗,如果第二到該字符串的最後一部分不強制轉換爲整數

地板
0
1

任何時候我們發現自己在問一個問題,比如「如何將1添加到字符串?」我們知道我們已經犯了設計錯誤。這就像問「這些領帶哪個更適合這個馬球領?」這只是錯誤的。

'M000000000009'就是所謂的「智能鑰匙」。也就是說,一列實際上包含兩個或更多個部分。這是打破第一個正常形式,因爲它不是原子的(儘管原子性是tricky to define)。

但這不是一些抽象的設計要點:智能鑰匙很笨。正如你所發現的,他們很難與之合作。在編寫查詢或填充記錄時,我們不可避免地會發現自己正在運用SUBSTR和INSTR。

更好的實現方法是將智能鑰匙的原子組件作爲單獨的列存儲,並在將它們呈現給用戶時將它們連接起來。這仍然有點痛苦,但甲骨文通過引入高度整潔的虛擬列來消除了11g中的煩勞。這些是基於規則的列,從其他列自動填充。我們可以在虛擬列上建立索引甚至限制。

因此,在您的示例中,您有一個包含字母前綴和單調遞增數字的密鑰。你可以這樣實現它:

create table t23 
    (cat_code varchar2(1) not null 
    , cat_number number(11,0) not null 
    , catalogue_no varchar2(12) 
     as (cast(cat_code||lpad(to_char(cat_number), 11, '0') as varchar2(12))) virtual 
    , constraint t23_pk primary key (catalogue_no) 
) 

LiveSQL demo script.

的數字部分cat_number是一個數字,所以你可以填充它像任何其他號碼 - 算術,用序列或 - 因爲12C - 作爲IDENTITY列:

create table t23 
    (cat_code varchar2(1) not null 
    , cat_number number generated always as identity 
    , catalogue_no varchar2(12) as (cast(cat_code||lpad(to_char(cat_number), 11, '0') as varchar2(12))) virtual 
    , constraint t23_pk primary key (catalogue_no) 
) 
/
0
votes
answers
18 views
+10

我嘗試在pl sql中編寫函數,但它生成一個錯誤ORA-00900:無效的SQL語句,究竟是什麼原因?

-1

我是pl sql的新手,我嘗試編寫一個函數,該函數應該從db讀取數據來控制它們並返回一個數字,但它會生成一個錯誤ORA-00900: invalid SQL statement我嘗試在pl sql中編寫函數,但它生成一個錯誤ORA-00900:無效的SQL語句,究竟是什麼原因?

FUNCTION get_cbk_values    ( TC_CODE    IN NUMBER, 
             MERCHANT_DOM   IN VARCHAR2, 
             MERCHANT_GROUP  IN VARCHAR2, 
             MCC     IN VARCHAR2, 
             COUNTRY    IN VARCHAR2, 
             RATE     OUT NUMBER, 
             FIX     OUT NUMBER) 
    RETURN NUMBER IS 
Response  NUMBER:=1; 

CURSOR cur_cbk_param IS SELECT CBA_RATE, CBA_FIX 
FROM cbk_prog_assign_rule WHERE 
    CBA_TCO = TC_CODE 
AND CBA_DOM_CODE = MERCHANT_DOM 
AND CBA_BMG_CODE = MERCHANT_GROUP 
AND CBA_MCC_CODE = MCC 
AND CBA_MER_COUN_CODE = COUNTRY; 

BEGIN 
LOOP 
FETCH cur_cbk_param into RATE, FIX; 
END LOOP; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
Response := 0; 
Return(Response); 
END; 
+0

首先,您需要從「CREATE OR REPLACE FUNCTION」開始,而不僅僅是「FUNCTION」。其次,在循環訪問並獲取結果之前,您需要「打開」您的光標。第三,你需要'退出'循環'WHEN cur_cbk_param%NOTFOUND'。第四,像這樣的遊標循環不會拋出「NO_DATA_FOUND」異常。第五,除非出現異常,否則你的函數不會「返回」一個值。您必須在所有情況下返回一個值。 –

+0

要有效診斷出發生的情況,您必須提供說明以創建表cbk_pro_assing_rule。一些示例數據將會有所幫助。 –

+0

[Oracle錯誤:ORA-00900:無效SQL語句]的可能重複(https://stackoverflow.com/questions/35946606/oracle-error-ora-00900-invalid-sql-statement) –

沙发
0
0

你可以使用cursor%ROWCOUNT檢查,如果沒有記錄返回,而不是no_data_found。注意,你必須有一個return語句,無論EXCEPTION。所以,你可以返回1成功,0返回失敗。

CREATE OR REPLACE FUNCTION get_cbk_values (
    tc_code   IN NUMBER, 
    merchant_dom  IN VARCHAR2, 
    merchant_group IN VARCHAR2, 
    mcc    IN VARCHAR2, 
    country   IN VARCHAR2, 
    rate    OUT NUMBER, 
    fix    OUT NUMBER 
) RETURN NUMBER IS 

    response NUMBER := 1; 
    CURSOR cur_cbk_param IS SELECT 
     cba_rate, 
     cba_fix 
          FROM 
     cbk_prog_assign_rule 
          WHERE 
     cba_tco = tc_code 
     AND cba_dom_code = merchant_dom 
     AND cba_bmg_code = merchant_group 
     AND cba_mcc_code = mcc 
     AND cba_mer_coun_code = country; 

BEGIN 
    OPEN cur_cbk_param; 
    LOOP 
     FETCH cur_cbk_param INTO rate,fix; 
     EXIT WHEN cur_cbk_param%notfound; 
    END LOOP; 
    IF 
     cur_cbk_param%rowcount = 0 
    THEN 
     response := 0; 
    END IF; 
    RETURN response; 
EXCEPTION 
    WHEN OTHERS THEN 
--Preferably use dbms_utility.format_error_backtrace or SQLERRM to display or log the message somewhere. 
     response := 0; 
     RETURN response; 
END; 
/
板凳
0
0

主要有3個失誤: 1替換函數的恆等式>>創建或替換功能 2-纔開始之後添加此行>>打開cur_cbk_param; 3-在執行部分添加此行(在例外之前)>>>>返回響應; 注意:不需要在括號內使用Response。

0
votes
answers
23 views
+10

通過數據庫鏈接插入ORA-01722

0

我正在使用oracle SQL,並希望通過鏈接將我的數據插入遠程數據庫。
通過數據庫鏈接插入ORA-01722

insert into [email protected] (<82 different columnNames>) 
values (<82 different values>); 

雖然我檢查到目前爲止所有數據類型,字段和值匹配,但我得到這個錯誤:

Errorcode 1722, SQL-Status 42000: ORA-01722: Invalid Number 
ORA-02063: previous line of MDB.IGM 

我明白了很多,如果有人可以幫助我這個錯誤。

V_ADITO_ONLINE_BEITRITT是一個視圖,如果這有幫助的話。

沙发
0
0

Source Orafaq.com

的ORA-01722( 「無效號碼」),當試圖將字符串轉換爲數字

在做INTO ... VALUES的INSERT(發生錯誤。 ..) 您嘗試插入的數據項之一是無效的數字。

找到並更正它。 如果所有數字看起來都是有效的,那麼您的列可能不按順序排列,並且VALUES子句中的項目正被插入NUMBER列而不是預期的VARCHAR2列。當表格添加或刪除列時會發生這種情況。

如果您正在執行INSERT或UPDATE,並使用提供值的子查詢。顯然,上述考慮也適用於此。是什麼讓這變得更加複雜是因爲有問題的字符串在表中被隱藏爲一行。解決方法是識別具有非數字字符串的行(或行),並更改數據(如果有錯誤)或向子查詢添加某些內容以避免選擇它。問題在於確定確切的行。 假設錯誤的數據是字母字符,可以使用以下查詢:

SELECT ... WHERE UPPER(col) != LOWER(col) 

其中COL與不良數據的列。

板凳
0
0

嘗試評論一半的字段名和值,並檢查ORA-1722是否仍然存在。當發現含有錯誤的一半時,嘗試對其一半進行評論等等。找到產生問題的確切字段&值,檢查並修復它們。

0
votes
answers
33 views
+10

觸發器在oracle2中相乘兩列

-1
create or replace trigger BAND_T BEFORE insert or update OF average_song_time, number_of_songs on BAND 
for each row 
declare 
    average_song_time number; 
    number_of_songs number; 
begin 
    if (:new.average_song_time * :new.number_of_songs > 100) ; 
     then 
     raise_application_error(error -2010'Play Time is too high'); 
    end if; 
end; 

/

想要在Oracle2中將兩列相乘,當兩列的值達到一定數量時,我的觸發器將被觸發,只是想知道該代碼出錯的地方?觸發器在oracle2中相乘兩列

+0

'declare'節未使用。和'raise_application_error(錯誤-2010'播放時間太高');' '應該是'raise_application_error(-20010,'播放時間太高');' – Ben

+0

創建或替換觸發器BAND_T 之前 插入或更新OF average_song_time,number_of_songs on BAND for each row begin if :new.average_song_time *:new.number_of_songs> 100; then raise_application_error(-20010,'Play Time is too high'); end if; 結束; / – dan

+0

爲了將來的參考,'select * from user_errors'會顯示你的編譯錯誤。 – APC

沙发
0
0

你做了幾個錯誤(它不適合的分號,RAISE語句中的ERROR,這裏沒用的DECLARE部分)。

看看這樣一個改進的代碼是否滿足您的需求。

create or replace trigger band_t 
    before insert or update of average_song_time, number_of_songs 
    on band 
    for each row 
begin 
    if :new.average_song_time * :new.number_of_songs > 100 then 
    raise_application_error(-20001, 'Play time is too high'); 
    end if; 
end; 
/
+0

呵呵,你是一個救生員,現在爲我工作非常感謝 – dan