From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Abrahamsen Subject: Re: Org-mode as a metalanguage: calling SQL "functions" Date: Tue, 02 Apr 2013 10:46:29 +0800 Message-ID: <87fvz9r6nu.fsf@ericabrahamsen.net> References: <87vc85raoh.fsf@ericabrahamsen.net> <87y5d1itxx.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([208.118.235.92]:40845) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UMr9P-0001fn-TF for emacs-orgmode@gnu.org; Mon, 01 Apr 2013 22:40:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UMr9N-0006uj-Ol for emacs-orgmode@gnu.org; Mon, 01 Apr 2013 22:40:43 -0400 Received: from plane.gmane.org ([80.91.229.3]:40444) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UMr9N-0006uP-Is for emacs-orgmode@gnu.org; Mon, 01 Apr 2013 22:40:41 -0400 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1UMr9k-0006la-78 for emacs-orgmode@gnu.org; Tue, 02 Apr 2013 04:41:04 +0200 Received: from 221.216.161.222 ([221.216.161.222]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 02 Apr 2013 04:41:04 +0200 Received: from eric by 221.216.161.222 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 02 Apr 2013 04:41:04 +0200 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org Eric Schulte writes: > Eric Abrahamsen writes: > >> Gary Oberbrunner writes: >> >>> It seems like you can define "procedures" in org-mode and call them >>> from elsewhere, with args. >>> But I'm not sure how well-defined that process is; the documentation >>> is not completely perfect yet I think. Here's one thing I'm trying >>> that seems not to work. >>> >>> I define a "procedure" as a named ref called recorddate with two args, >>> ver and order. The idea is I could later call that with different >>> values of those args. >>> >>> #+NAME: recorddate(order="desc") >>> #+BEGIN_SRC sql :exports none :colnames no :results scalar >>> select Event.CreatedAt from Event join MachineInfo as MI on >>> Event.MachineInfoId=MI.Id >>> where Event.CreatedAt is not NULL order by CreatedAt $order limit 1; >>> #+END_SRC sql >>> >>> (BTW, I really like how $ vars are substituted into SQL. Nice.) But >>> when I try to call it like this: >>> >>> * earliest record is call_recorddate(ver="'.'", order="asc") >>> or like this: >>> #+CALL: recorddate(ver="'.'", order="asc") >>> >>> and I try to export as LaTeX (or anything), I get >>> org-babel-ref-resolve: Reference 'recorddate' not found in this buffer >>> >>> Is this supposed to work? >> > > Yes, your example should work. From the "Evaluating code blocks" > section of the Org-mode manual. > > ,---- > | It is also possible to evaluate named code blocks from anywhere in an > | Org mode buffer or an Org mode table. Live code blocks located in the > | current Org mode buffer or in the "Library of Babel" (see *note Library > | of Babel::) can be executed. Named code blocks can be executed with a > | separate '#+CALL:' line or inline within a block of text. > `---- > > There is no need to load code blocks in the same buffer into the library > of babel. I think what he (and I, when I tried his version) ran into is that without a ":var" attribute on the named code block, you get the "not found" error. Ie, simply declaring #+name: recorddate(order="desc") isn't enough to let the block know to expect the var. Presumably that *should* be an error, as the variable should be declared before being used, but the actual error message is a little misleading. Eric > This example works for me evaluating code blocks in the same buffer > using call lines. > > #+Title: Call Example > > #+name: example-block > #+begin_src sh :var input="" > echo "input is $input" > #+end_src > > Here's a simple call using a named argument. > #+call: example-block(input="foo") > > #+RESULTS: example-block(input="foo") > : input is foo > > It also works with a positional argument. > #+call: example-block("bar") > > #+RESULTS: example-block("bar") > : input is bar > > When I export this to e.g., html I get the following. > > Call Example > > Call Example > > echo "input is $input" > > Here's a simple call using a named argument. > > > input is foo > > It also works with a positional argument. > > > input is bar > > Date: 2013-04-01T19:39-0600 > > Author: > > Org version 7.9.3f with Emacs version 24 > > Validate XHTML 1.0 > > > The call lines are replaced with their results as part of the export > process. > > If the above doesn't work for you, then I imagine something is wrong > with your install.