PLSQL’de string ifadenin array’a çevrilmesi

January 13th, 2014

PL/SQL’de parametre olarak string, belirtilen ayırac ile bölen fonksiyon. Eğer hiç ayırac kullanılmamışsa parametre olarak geçilen değer döner. Ayıraç birden fazla karakterden oluşabilir.

create or replace function str2array(pStr in varchar2, pDelim in varchar2 ) return dbms_utility.uncl_array is
  Result dbms_utility.uncl_array;
  i number;
  j number;
  lastpos number;
  iCount number;
  bFound boolean;
begin
  i:=1;
  lastpos:=1;
  iCount:=1;
  
  while i<=length(pStr) 
  loop          
     bFound:=false;
     
     if  substr(pStr,i,1)=substr(pDelim,1,1) then 
         
         bFound:=true;
         
         for j in 1..length(pDelim)
         loop
            if substr(pStr,i+j,1)<>substr(pDelim,j+1,1)then
                bFound:=false;
            end if;                 
         end loop;
         
         if bFound then           
            Result(iCount):=substr(pStr,lastpos,i-lastpos);
            iCount:=iCount+1;            
            i:=i+length(pDelim);
            lastpos:=i; 
         end if;
         
     end if;
     
     i:=i+1;
  end loop;
  
  if substr(pStr,lastpos,length(pStr)-lastpos+1)<>pDelim then 
    Result(iCount):=substr(pStr,lastpos,length(pStr)-lastpos+1);
  end if;
   
  
  return(Result);
end;

Örnek kullanım :

declare 
 arr dbms_utility.uncl_array;
 i number;
begin
  arr:= str2array('abc,d,ef',',');
  for i in 1..arr.count
  loop
     dbms_output.put_line( arr(i) );
  end loop;
end;

HTTPRIO componenti ile giden gelen XML’lerin bulunması

April 9th, 2011

Delphi’de THTTPRio componentini kullanarak webservis uygulaması geliştirirken giden ve gelen xml metinlerine ihtiyaç duyulabilir. Formumuzda HttpRio1 isimli componentimizin olduğunuz kabul ederek Giden için BeforeExecute metoduna ve Gelen için AfterExecute metoduna aşağıdaki ifadeler yazılır:


uses OPConvert;
// Giden
procedure TForm1.HTTPRIO1BeforeExecute(
const MethodName: String; var SOAPRequest: WideString);
begin
   ShowMessage(SOAPRequest);
end;
// Gelen
procedure TForm1.HTTPRIO1AfterExecute(
const MethodName: String; SOAPResponse: TStream);
var
   Str: string;
   sl : TStringList;
begin
   sl := TStringList.Create;
   SOAPResponse.Seek(0,soFromBeginning);
   sl.LoadFromStream(SOAPResponse);
   if (soUTF8EncodeXML in HTTPRIO1.Converter.Options) then
      Str:=UTF8Decode(sl.Text)
   else
     Str:=sl.Text;

   FreeAndNil(sl);
   ShowMessage(Str);
end;

WSE3 ile çalışırken WSE910,WSE065 hatası alınması

March 20th, 2011

Web servis ile çalışırken bağlandığınız server’in saati ile bağlanan bilgisayarın saati arasında fark timeToleranceInSeconds (WSE3 için default değeri 300 sn.)  değerinden fazla ise “WSE910: An error happened during the processing of a response message, and you can find the error in the inner exception. You can also find the response message in the Response property.”  hatasını alırsınız.

Mesajda belirtildiği gibi InnerException’a baktığımızda  : “Microsoft.Web.Services3.Security.SecurityFault: An error was discovered processing the <Security> header —> System.Exception: WSE065: Creation time of the timestamp is in the future. This typically indicates lack of synchronization between sender and receiver clocks. Make sure the clocks are synchronized or use the timeToleranceInSeconds element in the microsoft.web.services3 configuration section to adjust tolerance for lack of clock synchronization. …

timeToleranceInSeconds değerini arttırmak için Web.config dosyasında aşağıdaki değişikliği yapıyoruz. Örnekte timeToleranceInSeconds değeri 4200 olarak atanıyor.


<?xml version="1.0"?>
<configuration>
   <configSections>
      <section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
   </configSections>
    ...
    ...
    ...
   <microsoft.web.services3>
      <security>
         <timeToleranceInSeconds value="4200" />
      </security>
   </microsoft.web.services3>
</configuration>

Oracle’da rtf’i text’e çevirmek.

December 11th, 2010

Rtf dosyalarınızı text formatına çevirmeniz gerekebilir. Oracle’da bu işlemi oracle text fonksiyonlarını kullanarak yapabilirsiniz.

İlk önce policy oluşturmalısınız.

ctx_ddl.create_policy(policy_name => 'rtf2text_policy', FILTER => 'CTXSYS.AUTO_FILTER');

Çevirim Fonksiyonu

CREATE OR REPLACE FUNCTION "RTF2TEXT"(p_rtf clob) RETURN CLOB IS
c_text clob;
BEGIN
   ctx_doc.policy_filter(policy_name => 'rtf2text_policy',
                         document => p_rtf,
                         restab => c_text,
                         plaintext => TRUE);
   RETURN c_text;
END;

10gR2 Enterprise Edition ile test edilmiştir.

Oracle Enterprise Manager’i tekrar kurmak

July 4th, 2010

Oracle 10.2.1 için enterprise manager’in silinip tekrar kurulması 

Silmek için :
emca -deconfig dbcontrol db -repos drop 

Oluşturmak için :
emca -config dbcontrol db -repos create 


  
 
Subject: How To Drop, Create And Recreate DB Control In A 10g Database
  Doc ID: Note:278100.1 Type: BULLETIN
  Last Revision Date: 24-JAN-2008 Status: PUBLISHED

In this Document
  Purpose
  Scope and Application
  How To Drop, Create And Recreate DB Control In A 10g Database
     DB Control options:
     A.  Delete DB Control Objects:
     B. Create DB Control Objects
     C.  Recreate/ReConfig DB Control
  References 


Applies to:

Enterprise Manager Grid Control – Version: 10.1 to 11.1
Information in this document applies to any platform.
DBConsole 

Purpose

This article provides detailed instructions on how to 1) create, 2) drop and 3)recreate the repository and configuration files for the DB Control application used to manage a single 10g Database. 

Scope and Application

The steps in this article are written for a DBA or System Administrator who needs to create, drop or reconfigure the DB Control Application.  

The format of the document will include steps for both 10.1 and 10.2 EMCA because the commands changed between the two releases. 

For detailed instructions on DB Control 10.2 for RAC, please consult also:
Note 395162.1 How to manage DB Control 10.2 for RAC Database with emca
Note 395162.1 How to manage DB Control 10.2 for RAC Database with emca 

How To Drop, Create And Recreate DB Control In A 10g Database

DB Control options:

 

A.  Delete DB Control Objects:

Option 1.  Delete DB Control Configuration Files using EMCA scripts
Option 2.  Delete DB Control Configuration Files Manually:
Option 3.  Delete DB Control Repository Objects using RepManager
Option 4.  Delete DB Control Repository Objects Manually
Option 5.  Delete DB Control Configuration Files and Repository Objects using EMCA 


Option 1. Delete DB Control Configuration Files using EMCA scripts: 

For DB Control 10.1.x, run the command: <ORACLE_HOME>/bin/emca -x <sid>
For DB Control 10.2.x, run the command: <ORACLE_HOME>bin/emca -deconfig dbcontrol db

Option 2. Delete DB Control Configuration Files Manually: 

 

Remove the following directories from your filesystem:
<ORACLE_HOME>/<hostname_sid>
<ORACLE_HOME>/oc4j/j2ee/OC4J_DBConsole_<hostname>_<sid> 

NOTE: 
On Windows you also need to delete the DB Console service:
– run regedit
– navigate to HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
– locate the OracleDBConsole<sid> entry and delete it 

Alternatively on Windows XP and Windows Server 2003 you can run the following from the command line:
‘sc delete <service_name>’ 

– where <service_name> is the DB Control service name (typically: OracleDBConsole<sid>) 

Also available from Microsoft is the delsrv.exe command.   (Free download from Microsoft)

Option 3. Delete DB Control Repository using RepManager:

This option is not as complete as the other options.  You may find that dropping the repository using the commandline options is a better solution.  Also note, RepManager is not used to create a DB Control Repository. 

In both 10g R1 and R2 run:
<ORACLE_HOME>/sysman/admin/emdrep/bin/RepManager <hostname> <listener_port> <sid> -action drop

  

Warning: this command puts the database in Quiesce Mode.
Please consult the Note 375946.1 Running EMCA Results in Database quiesce And No
New Connections or OperationsNote 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be Performed During the DB Control Repository Creation
Option 4. Delete DB Control Repository Objects Manually 

Step 1: Drop AQ related objects in the SYSMAN schema
Logon SQLPLUS as user SYSMAN
SQL>exec DBMS_AQADM.DROP_QUEUE_TABLE(queue_table=>'MGMT_NOTIFY_QTABLE',force =>TRUE);

Step 2: Drop the DB Control Repository Objects
Logon SQLPLUS as user SYS or SYSTEM, and drop the sysman account and management objects:
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP RESTRICT;
SQL> EXEC sysman.emd_maintenance.remove_em_dbms_jobs;
SQL> EXEC sysman.setEMUserContext('',5);
SQL>REVOKE dba FROM sysman;
SQL> DECLARE
CURSOR c1 IS
SELECT owner, synonym_name name
FROM dba_synonyms
WHERE table_owner= 'SYSMAN';
BEGIN
FOR r1 IN c1 LOOP
IF r1.owner = 'PUBLIC' THEN
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM '||r1.name;
ELSE
EXECUTE IMMEDIATE 'DROP SYNONYM '||r1.owner||'.'||r1.name;
END IF;
END LOOP;
END;
/
SQL> DROP USER mgmt_view CASCADE;
SQL> DROP ROLE mgmt_user;
SQL> DROP USER sysman CASCADE;
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

Note: The above will completely delete the DB Control repository from the database; under certain circumstances (e.g. you want to recreate the repository later on) the following statements may be sufficient to remove the repository: 

Logon SQLPLUS as user SYS or SYSTEM, and drop the sysman account and management objects:
SQL> drop user sysman cascade;
SQL> drop role MGMT_USER;
SQL> drop user MGMT_VIEW cascade;
SQL> drop public synonym MGMT_TARGET_BLACKOUTS;
SQL> drop public synonym SETEMVIEWUSERCONTEXT;
Option 5. Delete DB Control Configuration Files and Repository Objects using EMCA

For DB Control 10.1.x, dropping both the configuration files and the repository objects is a two step process.  Run the following two commands: 

<ORACLE_HOME>/bin/emca -x <sid>
<ORACLE_HOME>/sysman/admin/emdrep/bin/RepManager <hostname> <listener_port> <sid> -action drop


For DB Control 10.2.x, both configuration files and repository objects can be deleted with a single command.  Run the command: 

<ORACLE_HOME>/bin/emca -deconfig dbcontrol db -repos drop

  

Warning: this command puts the database in Quiesce Mode.
Please consult the Note 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be Performed During the DB Control Repository Creation
Note 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be Performed During the DB Control Repository Creation 

B. Create DB Control Objects

Option 1.  Create the DB Control Configuration Files
Option 2.  Create the DB Control Repository Objects and Configuration Files 

Option 1.  Create the DB Control Configuration Files
To create only the DB Control configuration files, skipping the repository creation (this would be done for instance if you dropped only the files and left the repository in place): 

For DB Control 10.1.x, run the command: <ORACLE_HOME>/bin/emca -r
For DB Control 10.2.x, run the command: <ORACLE_HOME>/bin/emca -config dbcontrol db

Option 2. Create the DB Control Repository Objects and Configuration Files 

For DB Control 10.1.x, run the command: <ORACLE_HOME>/bin/emca
For DB Control 10.2.x, run the command: <ORACLE_HOME>bin/emca -config dbcontrol db -repos create

  

Warning: this command puts the database in Quiesce Mode.
Please consult the Note 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be Performed During the DB Control Repository Creation
Note 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be Performed During the DB Control Repository Creation 

C.  Recreate/ReConfig DB Control

Option 1.  Recreate the DB Control Configuration Files only (leave Repository intact)
Option 2.  Recreate the DB Control Configuration Files and Repository 

In 10.2, the EMCA commands can be used to reconfigure the existing installs without removing them first. 

Option 1. Recreate the DB Control Configuration Files only (leave Repository intact):
For DB Control 10.2.x, run the command: 

<ORACLE_HOME>/bin/emca -config dbcontrol db


Option 2. Recreate the DB Control Configuration Files and Repository

For DB Control 10.2.x, run the command: 

<ORACLE_HOME>/bin/emca -config dbcontrol db -repos recreate

  

Warning: this command puts the database in Quiesce Mode.
Please consult the Note 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be PerformedNote 375946.1 Running EMCA Results in Database quiesce And No
New Connections or Operations Can Be Performed During the DB Control Repository Creation
For additional information on EMCA commandline options, please see the Oracle Enterprise Manager 10g Advanced Configuration Guide or see Note 330130.1 Overview Of The EMCA Commands Available for DB Control 10.2 

References

Note 375946.1 – Problem: Running EMCA Results in Database quiesce And No New Connections or Operations Can Be Performed During the DB Control Repository Creation
Note 395162.1 – How to manage DB Control 10.2 for RAC Database with emca
Note 456437.1 – Ora-24005 Error Trying To Drop User Sysman Cascade 

Keywords

EMCA‘   ‘REPMANAGER‘   ‘QUIESCE‘   ‘DB~CONTROL‘   ‘DBCONSOLE‘   ‘DBMS_AQADM.DROP_QUEUE_TABLE‘   ‘REPMANAGER

Oracle’da sql ile bakiye hesaplama

April 22nd, 2010

Oracle’da analitik fonksiyonları kullanarak bakiye hesaplanabilmektedir. Örneğimizde bakiye test tablosu oluşturup test verilerini giriyoruz. Hesaplama sutunu için SUM grup fonksiyonunu OVER ile kullanarak satır satır çalışmasını sağlıyoruz. ORDER BY ile toplama işlemini hangi sırayla yapılmasını gerektiğini belirtiyoruz.


create table bakiye_test (
  id number primary key,
  tarih date not null,
  giren number not null,
  cikan number not null
);


insert into bakiye_test values (1,'05.04.2010',100,0);
insert into bakiye_test values (2,'07.04.2010',0,200);
insert into bakiye_test values (3,'09.04.2010',300,0);
insert into bakiye_test values (4,'10.04.2010',100,0);
insert into bakiye_test values (5,'12.04.2010',0,50);
insert into bakiye_test values (6,'19.04.2010',50,0);
insert into bakiye_test values (7,'21.04.2010',0,30);
commit;


SQL> SELECT B.*, SUM( GIREN-CIKAN ) OVER (ORDER BY TARIH ASC ) BAKIYE FROM BAKIYE_TEST B;

        ID TARIH            GIREN      CIKAN     BAKIYE
---------- ----------- ---------- ---------- ----------
         1 05.04.2010         100          0        100
         2 07.04.2010           0        200       -100
         3 09.04.2010         300          0        200
         4 10.04.2010         100          0        300
         5 12.04.2010           0         50        250
         6 19.04.2010          50          0        300
         7 21.04.2010           0         30        270

7 rows selected

Foreign Key ile bağlantı kurulmuş kayıtlarda güncelleme yapmak.

April 10th, 2010

Primary Key – Foreign Key ilişkisi kurulmuş olan bir yapıda,  foreign key olan alanların değerini yeni bir değerle nasıl değiştirebiliriz?

Bir örnek ile açıklamaya çalışalım; Müşteri ve ödeme  bilgilerini içeren iki tablomuz ve aralarında Müşteri id üzerinden foreign key bağlantısı olmuş olsun. Müşteri bilgileri tablosunda A firmasının ikinci bir kaydının A* şeklinde açılmış olduğunu ve bu yanlış açılan firma için ödeme bilgisi girildiğini kabul edelim. A* firmasının yanlış açılmış bir kayıt olduğunu, A* firmasına yapılan ödeme bilgilerinin A firması olarak değiştirilmesi gerektiğinde ödeme bilgilerindeki Müşteri id’sinin güncellenmesi gerekecektir.  Tek tablo için bir update yeterli iken 100’den fazla tabloda update yapılması gerektiğinde ne yapılmalıdır? İlgili tabloya foreign key’le bağlı olan tabloları ve ilişkili olan alanları bulup  alandaki değerleri güncellemek en kestirme yol olacaktır.

Şöyle ki:

drop table odeme_test;
drop table musteri_test;

create table musteri_test (
   musteri_id number primary key,
   adi varchar2(20)
);


create table odeme_test (
   musteri_id number references musteri_test(musteri_id) ,
   tutar number
);

insert into musteri_test values (1,'A FIRMASI');
insert into musteri_test values (2,'B FIRMASI');
insert into musteri_test values (3,'A* FIRMASI');

insert into odeme_test values (1,10);
insert into odeme_test values (2,-10);
insert into odeme_test values (3,20);
insert into odeme_test values (1,-20);
insert into odeme_test values (2,30);
insert into odeme_test values (3,-30);
commit;

SQL> select * from musteri_test;

MUSTERI_ID ADI
---------- --------------------
         1 A FIRMASI
         2 B FIRMASI
         3 A* FIRMASI

SQL> select * from odeme_test;

MUSTERI_ID      TUTAR
---------- ----------
         1         10
         2        -10
         3         20
         1        -20
         2         30
         3        -30

6 satırları seçildi.

Güncellemeleri yapacak sql’ler oluşturuluyor…

SQL> select
 'UPDATE '|| a.OWNER ||'.'|| c.TABLE_NAME ||
 ' SET '|| c.COLUMN_NAME ||'=&YENI'||
 ' WHERE '|| c.COLUMN_NAME ||'=&ESKI;' update_sql
 from
 all_constraints a,
 all_cons_columns c
 where
 a.constraint_type = 'R'
 and a.CONSTRAINT_NAME = c.CONSTRAINT_NAME
 and r_constraint_name in
 (
 select constraint_name
 from all_constraints
 where constraint_type in ('P')
 and table_name = 'MUSTERI_TEST'
 );

yeni değerini girin: 1
eski 3: ' SET '|| c.COLUMN_NAME ||' = &YENI'||
yeni 3: ' SET '|| c.COLUMN_NAME ||' = 1'||
eski değerini girin: 3
eski 4: ' WHERE '|| c.COLUMN_NAME ||'= &ESKI;' update_sql
yeni 4: ' WHERE '|| c.COLUMN_NAME ||'= 3;' update_sql
UPDATE_SQL
-------------------------------------------------------
UPDATE ZGUVEN.ODEME_TEST SET MUSTERI_ID=1 WHERE MUSTERI_ID=3;

SQL> UPDATE ZGUVEN.ODEME_TEST SET MUSTERI_ID=1 WHERE MUSTERI_ID=3;

2 satırları güncellendi.

SQL> select * from odeme_test;

MUSTERI_ID      TUTAR
---------- ----------
         1         10
         2        -10
         1         20
         1        -20
         2         30
         1        -30

6 satırları seçildi.

SQL>

Excel’de yıl, ay, gün olarak yaş hesaplama

April 7th, 2010

Excel’de iki tarih arasındaki farkı yıl, ay,gün olarak hesaplamanız gerekebilir.

Yukarıdaki gibi bir hesaplama yapmak için

Yıl hesaplaması için C2 hücresine:

=YIL(B2)-YIL(A2)-EĞER(YADA(AY(B2)<AY(A2);VE(AY(B2)=AY(A2);GÜN(B2)<GÜN(A2)));1;0)

Ay hesaplaması için D2 hücresine:

=AY(B2)-AY(A2)+EĞER(VE(AY(B2)<=AY(A2);GÜN(B2)<GÜN(A2));11;EĞER(VE(AY(B2)<AY(A2);GÜN(B2) >=GÜN(A2));12;EĞER(VE(AY(B2)>AY(A2);GÜN(B2)<GÜN(A2));-1)))

Gün hesaplaması için E2 hücresine:

=B2-TARİH(YIL(B2);AY(B2)-EĞER(GÜN(B2)<GÜN(A2);1;0);GÜN(A2))

Resimdeki excel dosyasını indirmek için tıklayın!

http://support.microsoft.com/kb/214094/tr

Bir tablo üzerinde kayıt varsa güncelleme yoksa ekleme yapmak

March 30th, 2010

Oracle’da merge kelimesini kullanarak tek sql ile kayıt varsa güncelleme yoksa ekleme yaptırabiliriz (Upsert).
Upsert Sql’imiz:

 merge into tablo t
 using dual s on (t.alan1=1)
 when matched then
   update set alan2='UPDATE'
 when not matched then
   insert (alan1,alan2) values (1,'INSERT');

Test ediyoruz :

SQL> create table tablo (alan1 number(10),alan2 varchar2(10));

Table created

SQL> select * from tablo;

      ALAN1 ALAN2
----------- ----------

SQL> merge into tablo t
2 using dual s on (t.alan1=1)
3 when matched then
4 update set alan2='UPDATE'
5 when not matched then
6 insert (alan1,alan2) values (1,'INSERT');

Done

SQL> select * from tablo;

      ALAN1 ALAN2
----------- ----------
          1 INSERT

SQL> merge into tablo t
2 using dual s on (t.alan1=1)
3 when matched then
4 update set alan2='UPDATE'
5 when not matched then
6 insert (alan1,alan2) values (1,'INSERT');

Done

SQL> select * from tablo;

      ALAN1 ALAN2
----------- ----------
          1 UPDATE

SQL> commit;

Commit complete

SQL>

Windows 7’de pdf dosyalarında problem.

February 7th, 2010

Windows 7 ‘de internet explorer’de pdf dosyalarını açarken “Internet Explorer cannot display the webpage” hatası alındığında yapılması gerekenler :

  1. Internet explorer’i kapatın
  2. Adobe reader’i açın
  3. Edit -> Preferences‘i tıklayın.  
  4. Categories listesinden internet‘i seçin.
  5. Display PDF in browser  seçeneğindeki seçimi kaldırın.