Çarşamba, Kasım 30, 2005

Contains içinde PL/SQL fonskiyonları

Farzedelim turkcesi fonksiyonu verilen İngilizce kelimenin Türkçe karşılığını veriyor ve kullanıcısın bu fonksiyonu yürütme hakkı var. Bu durumda aşağıdaki şekilde Contains sorgusu içinde fonksiyon şu şekilde kullanılabilir:

SELECT SCORE(1), title from news WHERE CONTAINS(text, turkcesi('cat'), 1) > 0 ORDER BY SCORE(1);

Örnek fonksiyon:

Create or Replace Function Get_Terms ( inTerm IN VARCHAR2 )
return VARCHAR2
as
my_thes VARCHAR2(4) := 'NSTC';
xtab ctx_thes.exp_tab;
result VARCHAR2(1000);
begin
ctx_thes.syn(xtab,inTerm,my_thes);
result := xtab(1).xphrase;
for i in 2..xtab.count loop
result:= result ' accum ' xtab(i).xphrase;
end loop;
dbms_output.put_line(result);
return result;
end;

Bir fonksiyonu ya da prosedürü başka kullanıcılara yürütme hakkı vermek için gerekli yazım kuralı:

grant execute on object to user;


select name, score(1) from doc_table where contains(text,ctxsys.get_terms('ships'),1)>0

Salı, Kasım 01, 2005

Oracle, Hazır Java Prosedürleri

[oracle@ullman oracle]$ loadjava -u kullanici/sifre -v -resolve oracle.java
arguments: '-u' 'kullanici/sifre' '-v' '-resolve' 'oracle.java'oracleoradb: relocation error: /opt/oracle/product/9.2.0.2/lib/libjox9.so: undefined symbol: __fixunssfdiSQL Error while connecting with oci8 driver to default database: ORA-12547: TNS:lost contact
exiting : could not open connection

hatasi alinca hemen yapmaniz gerekn degiklik su:
loadjava -u kullanici/sifre@oracle_sid -v -resolve oracle.java

Ornek bir java kodu:

import oracle.jdbc.*;
import java.sql.*;
public class oracle {

public static void show(){
System.out.println("Your tables");
try {
Connection conn =
DriverManager.getConnection("jdbc:default:connection:");
String sql =" select table_name from cat";
Statement stmt = null;
ResultSet rs = null;
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
String name =rs.getString("table_name");
System.out.println(name);
}
rs.close();
stmt.close();
conn.close();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}

}
}


Diger Ornek:

Bunun icin once jakarta.oro paketini yuklemek gerek.
loadjava -u user/passwd@oradb -v -resolve jakarta-oro-2.0.8.jar
sonra
loadjava -u user/passwd@oradb -v -resolve CompareDates.java

import org.apache.oro.text.regex.*;
public class CompareDates {


/** * @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Compare("Fri Nov 09 00:56:48 EST 1969", "2007"));
}

public static int Compare(String s_date1, String s_date2){
int date1 = 0;
int date2 = 0;//
PatternMatcherInput input;
//April 13, 2001
String regexp = "[1-2][0-9]{3}";
PatternCompiler compiler = new Perl5Compiler();
input = new PatternMatcherInput(s_date1);
try{
Pattern pattern = compiler.compile(regexp, Perl5Compiler.CASE_INSENSITIVE_MASK);
PatternMatcher matcher = new Perl5Matcher();
MatchResult result = null;
while (matcher.contains(input,pattern)){
result = matcher.getMatch();
date1 = Integer.parseInt(result.group(result.groups()-1)); }
input = new PatternMatcherInput(s_date2);
while (matcher.contains(input,pattern)){
result = matcher.getMatch();
date2 = Integer.parseInt(result.group(result.groups()-1));
}
catch (MalformedPatternException e){
System.out.println(e.getMessage());
}
if (date1> date2){
return date1;
}
else {
return date2;
}
}
}

CREATE OR REPLACE FUNCTION compare_dates
(date1 IN VARCHAR2, date2 IN VARCHAR2)
RETURN NUMBER IS
LANGUAGE JAVA
NAME 'CompareDates.Compare(java.lang.String, java.lang.String) return int';
/

Kullanimi:
select compare_dates('2004','1694') from dual;
Sonuc:
COMPARE_DATES('2004','1694')
----------------------------
2004

ctxsys fonksiyonları

Ctxsys kullacısına ait fonksiyonları kendinize göre düzenleyip yeni fonksiyonlar oluşturmak istediğinizde ne yazık ki ctxsys kullanıcısı olarak bu fonksiyonları oluşturduktan sonra herkese çalıştırma hakkı vermekten başka çözüm yok gibi. En azından bu işe yarıyor.
create or replace procedure get_synset( term IN VARCHAR2)

AS
my_thes VARCHAR2(4) := 'NSTC';
xtab ctx_thes.exp_tab;

begin
ctx_thes.syn(xtab,term,my_thes);
for i in 1..xtab.count loop
dbms_output.put_line(lpad(' ',2*xtab(i).xlevel)
xtab(i).xrel ' ' xtab(i).xphrase);
end loop;
end;

grant execute on get_synset to public;

Prosedürler

select * from user_objects where object_type = 'PROCEDURE';
select text from user_source where name = 'PROCEDURE_NAME';