# pi mit sql ermitteln



## Frankdfe (27. Juli 2004)

Hallo!

Wie kann ich mit einer SQL-Abfrage auf die Konstante PI zugreifen (unter Oracle) um z.B. Berechnungen damit durchzuführen?  Also z.B.

select tab.a*pi from tab;

Der Weg atan(1)*4 statt pi zu verwenden geht zwar, ist aber nicht sehr elegant.
.


----------



## Thomas Darimont (27. Juli 2004)

Hallo!

Du könntest in Oracle die Java Klasse java.lang.Math verwenden. Dort findest du alle möglichen Mathematischen Konstanten  (natürlich nur angenähert ;-) )

Gruß Tom


----------



## Frankdfe (28. Juli 2004)

Wie kann ich denn in SQL auf Kava-Klassen zugreifen? Kannst du mir ein Beispiel für ein SQL-Statement(mit PI) nennen?


----------



## Thomas Darimont (28. Juli 2004)

Hallo!

Kein Problem:


```
create or replace package oracle_test
as
function return_pi return number
as
language java
name 'oracle_test.return_pi() return double';

end oracle_test;
/

create or replace and compile
java source named "oracle_test"
as

public class oracle_test extends Object{
   public static double return_pi(){
      return java.lang.Math.PI;
   }
}
/

select oracle_test.return_pi PI from dual;

Ausgabe:

                  PI
-----------------
3,14159265
```

Gruß Tom


----------



## squeaker (28. Juli 2004)

das ist aber nicht mehr wirklich SQL - das ist eher Oracle-SQL.

aber es gibt auch die SQL-Funktion PI(). Sollte überall funktionieren und braucht kein Java (nichts gegen Java - aber das ist mit Artillerie nach Spatzen geschossen).

Aus dem MySQL Handbuch:


```
PI() 
Returns the value of PI. The default number of decimals displayed is five, but MySQL internally uses the full double-precision value for PI. mysql> SELECT PI();
        -> 3.141593
mysql> SELECT PI()+0.000000000000000000;
        -> 3.141592653589793116
```


----------



## Thomas Darimont (28. Juli 2004)

Hallo!

Frank wollte aber doch eine Oracle Lösung (siehe erster Post)

Gruß Tom


----------



## squeaker (28. Juli 2004)

Sogar Oracle kann SQL 

select tab.a*pi() from tab;

sollte also eigentlich funktionieren.


----------



## Thomas Darimont (28. Juli 2004)

Hallo!

Also meine Oracle Version:
Oracle9i Release 9.2.0.3.0 - Production
JServer Release 9.2.0.3.0 - Production

sagt dazu:


```
SQL> select pi() from dual;
select pi() from dual;
            *
Fehler in Zeile 1:
ORA-00904: "PI" : invalid identifier
```

Gruß Tom


----------



## Thomas Darimont (28. Juli 2004)

Hallo!



> (nichts gegen Java - aber das ist mit Artillerie nach Spatzen geschossen).



Denke ich nicht, dass macht so gut wie gar nix aus, da in Oracle die JVM fest integriert ist. Aussderm könnte man ja, wenn das jeweilige statement einer Optimierung bedarf ganz einfach eine StoredProcedure anlegen wleche nur einmal den Funktionsaufruf "return_pi" durchführt diesen Wert zwischenspeichert und dann immer den aus dem Zwischenspeicher verwendet.

Gruß Tom


----------



## squeaker (28. Juli 2004)

Erstaunlich, dass Oracle das nicht kann. Dann entschuldige bitte die falsche Kritik.


----------



## Frankdfe (28. Juli 2004)

Danke für die Antworten.

Ganz schön umständlich in Oracle. Da ist meine ursrpünliche Lösung 4*atan(1) gar nicht so schlecht. 
.


----------



## ManicMarble (30. Juli 2004)

Rein aus Interesse:

Gesetzt den Fall, man arbeitet mit einer DB die kein PI() versteht und ebenso vorausgesetzt man ist kein Mathematik-Purist, was spricht dagegen, einfach Pi als Wert '3.1415' zu verwenden, bzw. wenns genauer sein muss, dann eben '3.1415926535897932384626433832795'?

Das wäre jedenfalls mein erster Gedanke gewesen, noch bevor ich auf die Idee 4*ATAN(1) gekommen wäre. 

Falls ihr diesen Ansatz zu unwissenschaftlich findet, dann hab' ich nix gesagt...

Grüße,
Martin


----------



## Movera (2. August 2004)

Hallo,

Oracle liefert tatsächlich kein PI mit. Dafür erhält man die wunderbare Möglichkeit, selber Funktionen zu erstellen:

create or replace function pi return number as
begin
   return 3.14159265359;
end;
/

SQL> select 3 * pi from dual;

     3*PI
---------
 9,424778

So einfach kann das Leben mit Oracle sein!


----------

